POJ 2811 熄灯问题
#include<iostream>
#include<string.h>
usingnamespace std;
int N;
int map[7][8];
int orignal[7][8];
int pre[7][8];
int sequence[7];
voidpress(int i,int j)//按下坐标为 (i,j)的按钮
{
map[i][j]=(map[i][j]+1)%2;
map[i-1][j]=(map[i-1][j]+1)%2;
map[i+1][j]=(map[i+1][j]+1)%2;
map[i][j-1]=(map[i][j-1]+1)%2;
map[i][j+1]=(map[i][j+1]+1)%2;
}
int cmp()
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=6;j++)
{
if(map[i][j]==1)
{return0;
}
}
}
return1;
}
voidbinary(int n)
{
int i=0;
while(n!=0)
{
sequence[++i]=n%2;
n>>=1;
}
}
voidsolve()
{
int i,j,k;
for(i=0;i<64;i++)
{
for(j=1;j<=5;j++)
{
for(k=1;k<=6;k++)
{
map[j][k]=orignal[j][k];
}
}
memset(sequence,0,sizeof(sequence));
memset(pre,0,sizeof(pre));
binary(i);
for(j=1;j<=6;j++)
{
if(sequence[j]==1)
{
press(1,j);
pre[1][j]=1;
}
}
for(j=2;j<=5;j++)
{
for(k=1;k<=6;k++)
{
if(map[j-1][k]==1)
{press(j,k);
pre[j][k]=1;
}
}
}
if(cmp()==1)
{
break;
}
}
for(i=1;i<=5;i++)
{
for(j=1;j<=6;j++)
{
if(j==6)
{
cout<<pre[i][j]<<endl;
}
else
{
cout<<pre[i][j]<<" ";
}
}
}
}
intmain()
{
cin>>N;
int cases=0;
while(N--)
{
cases++;
memset(map,0,sizeof(map));//0表示是熄灭状态,1表示是亮着状态
int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=6;j++)
{
cin>>map[i][j];
orignal[i][j]=map[i][j];
}
}
cout<<"PUZZLE #"<<cases<<endl;
solve();
}
return0;
}
posted on 2011-05-22 22:36 lonelycatcher 阅读(714) 评论(0) 编辑 收藏 举报