poj 1222 EXTENDED LIGHTS OUT

这题用的是暴力枚举第一排的情况,然后出解,听discuss里说能用高斯消去发,有空再试
#include <stdio.h>
#include 
<string.h>

int n;
int data[10][10], t[10][10], da[10][10];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

void turn(int i, int j)
{
    t[i][j]
=!t[i][j];
    
int x, y;
    
for ( int k = 0; k < 4; k++ )
    {
        y
=i+dir[k][0];
        x
=j+dir[k][1];
        
if ( 0 <= x && x < 6 && 0 <= y && y < 5) t[y][x]=!t[y][x];
    }
}
int work()
{
    
int i, j;
    
for ( i = 0; i < 5; i++ )
        
for ( j = 0; j <6; j++ )
            t[i][j]
=data[i][j];
    
for ( j = 0; j < 6; j++ )
        
if ( da[0][j] ) turn(0, j);
    
for ( i = 1; i < 5; i++ )
    {
        
for ( j = 0; j <6; j++ )
        {
            
if (t[i-1][j])
            {
                turn(i, j);
                da[i][j]
=1;
            }
        }
    }
    
for ( i = 0; i < 5; i++ )
        
for ( j = 0; j < 6; j++ )
            
if ( t[i][j] ) return 0;
    
return 1;
}
void print()
{
    
for ( int i = 0; i < 5; i++ )
    {
        printf(
"%d", da[i][0]);
        
for ( int j = 1; j < 6; j++ )
            printf(
" %d", da[i][j]);
        putchar(
10);
    }
}

int main()
{
    scanf(
"%d"&n);
    
int m, i, j, k, num;
    
for ( m = 1; m <= n; m++ )
    {
        
for ( i = 0; i < 5 ; i++ )
            
for ( j = 0; j < 6 ; j++ )
                scanf(
"%d", data[i]+j);
        printf(
"PUZZLE #%d\n", m);
        
for ( k = 0; k < 64; k++ )
        {
            num
= k;
            memset(da, 
0sizeof(da));
            
for ( j = 0; j < 6 && num; j++ )
            {
                da[
0][j]=num&1;
                num
=num>>1;
            }
            
if (1 == work())
                print();
        }
    }
    
return 0;
}

posted on 2011-08-11 00:26 purplest 阅读(410) 评论(0)  编辑 收藏 引用 所属分类: 枚举


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论