poj 1222 经典枚举

来源:互联网 发布:海南网络广播电视台 编辑:程序博客网 时间:2024/06/05 07:04

点击打开链接

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int M=8;int g[M][M],button[M][M];bool solve(){int i,j,k;for(i=1;i<5;i++) //根据第i行的state 确定第i+1行的state {for(j=1;j<=6;j++){button[i+1][j]=(g[i][j]+button[i][j]+button[i][j-1]+button[i][j+1]+button[i-1][j])%2;}}for(j=1;j<=6;j++){//原来如果1   总的按钮产生的效果也要为1  原来0 总的按钮0 if(g[5][j]!=(button[5][j]+button[5][j-1]+button[5][j+1]+button[4][j])%2)//判断最后一行灯是否全灭 {return false;}} return true;}void enumerate(){int i,j,k;k=0;for(k=1;k<=6;k++){button[1][k]=0;}while(!solve()){k=1;button[1][k]++;while(button[1][k]>1){button[1][k]=0;k++;button[1][k]++;}}}int main(){int cas,c;cin>>cas;c=0;while(cas--){for(int i=0;i<=6;i++){for(int j=0;j<=7;j++){if(i==0||j==0||j==7||i==6){g[i][j]=0;}elsecin>>g[i][j];}}enumerate();//枚举第一行按钮的state(第一行按完后 第一行中可能有些灯没灭) 为了使全部的灯熄灭 第2行的状态就固定了 (第二行要是第一行的灯全熄灭) // 依次类推 最后一行使倒数第二行全灭 只要最后一行也熄灭了 则全部的灯都熄灭了 printf("PUZZLE #%d\n",++c);for(int i=1;i<=5;i++){for(int j=1;j<=6;j++){cout<<button[i][j]<<' ';}cout<<endl;}}return 0;}


0 0