Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

POJ1222(枚举开关问题)

$
0
0

题目:EXTENDED LIGHTS OUT

 

题意:5*6的一个由灯组成的方阵 操作一个灯 周围的上下左右四个灯会发生相应变化 即由灭变亮 由亮变灭 问如何操作使灯全灭。

本题方法:猛戳这里

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

const int N=105;

int equ,var;
int a[N][N];
int x[N];
bool free_x[N];
int free_num;

void Debug()
{
    int i,j;
    for(i=0;i<equ;i++)
    {
        for(j=0;j<var+1;j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}

int absx(int x)
{
    return x<0? -x:x;
}

int gcd(int a,int b)
{
    return b? gcd(b,a%b):a;
}

int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}

int Gauss()
{
    int i,j,k;
    int max_r;
    int col;
    int ta,tb;
    int LCM,temp;
    int free_x_num;
    int free_index;
    col=0;
    for(k=0;k<equ&&col<var;k++,col++)
    {
        max_r=k;
        for(i=k+1;i<equ;i++)
        {
            if(absx(a[i][col])>absx(a[max_r][col])) max_r=i;
        }
        if(max_r!=k)
        {
            for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);
        }
        if(a[k][col]==0)
        {
            k--;continue;
        }
        for(i=k+1;i<equ;i++)
        {
            if(a[i][col]!=0)
            {
                LCM=lcm(absx(a[i][col]),absx(a[k][col]));
                ta=LCM/absx(a[i][col]);
                tb=LCM/absx(a[k][col]);
                if(a[i][col]*a[k][col]<0) tb=-tb;
                for(j=col;j<var+1;j++)
                   a[i][j]=(a[i][j]*ta%2-a[k][j]*tb%2+2)%2;
            }
        }
    }
    //Debug();
    for(i=k;i<equ;i++)
    {
        if(a[i][col]!=0) return -1;
    }
    if(k<equ)
    {
        for(i=k-1;i>=0;i--)
        {
            free_x_num=0;
            for(j=0;j<var;j++)
            {
                if(a[i][j]!=0&&free_x[j])
                {
                    free_x_num++;
                    free_index=j;
                }
            }
            if(free_x_num>1) continue;
            temp=a[i][var]%2;
            for(j=0;j<var;j++)
            {
                if(a[i][j]!=0&&j!=free_index) temp-=a[i][j]*x[j];
            }
            x[free_index]=temp;
            free_x[free_index]=0;
        }
        return var-k;
    }
    for(i=var-1;i>=0;i--)
    {
        temp=a[i][var]%2;
        for(j=i+1;j<var;j++)
        {
            if(a[i][j]!=0) temp=(temp%2-a[i][j]*x[j]%2+2)%2;
        }
        if(temp%a[i][i]!=0) return -2;
        x[i]=(temp/a[i][i])%2;
    }
    return 0;
}

int main()
{
    int i,j,t,k=1;
    scanf("%d",&t);
    equ=30;var=30;
    while(t--)
    {
        memset(a,0,sizeof(a));
        memset(x,0,sizeof(x));
        memset(free_x,1,sizeof(free_x));
        for(i=0;i<5;i++)
        {
            for(j=0;j<6;j++)
            {
                if(i-1>=0) a[i*6+j][(i-1)*6+j]=1;
                if(i+1<=4) a[i*6+j][(i+1)*6+j]=1;
                if(j-1>=0) a[i*6+j][i*6+j-1]=1;
                if(j+1<=5) a[i*6+j][i*6+j+1]=1;
                a[i*6+j][i*6+j]=1;
                scanf("%d",&a[i*6+j][30]);
            }
        }
        free_num=Gauss();
        if(free_num==-1)
        {
            puts("No Answer!");
            continue;
        }
        if(free_num==-2)
        {
            puts("With double but don't has integer solutions!");
            continue;
        }
        if(free_num>=0)
        {
            int tt=0;
            printf("PUZZLE #%d\n",k++);
            for(i=0;i<var;i++)
            {
                tt++;
                if(tt%6==0) printf("%d\n",x[i]);
                else        printf("%d ",x[i]);
            }
        }
    }
    return 0;
}


 

作者:ACdreamers 发表于2013-5-31 2:44:29 原文链接
阅读:130 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>