poj1222
当模板用
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dx[]={0,0,0,-1,1};
int dy[]={0,1,-1,0,0};
int f[10][10];
int flip[10][10];
int otp[10][10];
int get(int x,int y)
{
int c=f[x][y];
for(int i=0;i<5;i++){
int x2=x+dx[i],y2=y+dy[i];
if(x2>=0&&x2<5&&y2>=0&&y2<6)
c+=flip[x2][y2];
}
return c%2;
}
int calc()
{
for(int i=1;i<5;i++){
for(int j=0;j<6;j++){
if(get(i-1,j)!=0){
flip[i][j]=1;
}
}
}
for(int i=0;i<6;i++){
if(get(4,i)!=0){
return -1;
}
}
int ans=0;
for(int i=0;i<5;i++){
for(int j=0;j<6;j++){
ans+=flip[i][j];
}
}
return ans;
}
int main()
{
int num;
cin>>num;
int cnt=1;
while(num--){
int res=-1;
for(int i=0;i<5;i++){
for(int j=0;j<6;j++){
cin>>f[i][j];
}
}
for(int i=0;i<1<<6;i++){ //按照字典序尝试第一行的所有可能性
memset(flip,0,sizeof(flip));
for(int j=0;j<6;j++){
flip[0][6-j-1]=(i>>j)&1; //是利用01字符串初始化而已,用时候还是01数组
} //注意是倒着来的
int ans=calc();
if(ans>=0&&(ans<=res||res==-1)){
res=ans;
memcpy(otp,flip,sizeof(flip));
}
}
printf("PUZZLE #%d\n",cnt++);
for(int i=0;i<5;i++){
for(int j=0;j<6;j++){
cout<<otp[i][j];
if(j!=5)cout<<" ";
else cout<<endl;
}
}
}
return 0;
}
这是二维下的翻转问题,可以用bfs,也可以用这种翻转基本法,高斯消元还没学,不晓得怎么搞