ZOJ 1354 Extended Lights Out(枚举)

来源:互联网 发布:演唱会门票制作软件 编辑:程序博客网 时间:2024/05/21 07:10

枚举第一行的64种可能,然后对于除第一行的每一个i,j值,若[i-1,j]亮着灯就要把[i,j]开关开起来关掉[i-1,j]的灯

#include <iostream>#include <cstdio>#include <vector>using namespace std;bool maze[5][6],ans[5][6],temp[5][6];int cnt[5][6];int di[]={0,-1,1,0,0},dj[]={0,0,0,-1,1};vector<int>stak;bool dfs(int curi){if(curi==6){memcpy(temp,maze,sizeof(maze));for (int i=0;i<6;++i){if(stak[i]==1){ans[0][i]=1;for (int k=0;k<5;++k){int ni=0+di[k],nj=i+dj[k];if(ni>=0&&ni<5&&nj>=0&&nj<6){temp[ni][nj]^=1;}}}else{ans[0][i]=0;}}for (int i=1;i<5;++i){//只要i-1 j的灯还是亮点的 i j开关就要开起来,关闭掉上面的灯for (int j=0;j<6;++j){if(temp[i-1][j]==1){ans[i][j]=1;for (int k=0;k<5;++k){int ni=i+di[k],nj=j+dj[k];if(ni>=0&&ni<5&&nj>=0&&nj<6){temp[ni][nj]^=1;}}}else{ans[i][j]=0;}}}for (int i=0;i<5;++i){//判断是否全部关闭了for (int j=0;j<6;++j){if(temp[i][j])return false;}}return true;}stak.push_back(1);if(dfs(curi+1))return true;stak.pop_back();stak.push_back(0);if(dfs(curi+1))return true;stak.pop_back();return false;}int main(){int t,cas=1;scanf("%d",&t);while (t--){for (int i=0;i<5;++i){for (int j=0;j<6;++j){int temp;scanf("%d",&temp);maze[i][j]=temp;}}stak.clear();dfs(0);printf("PUZZLE #%d\n",cas++);for (int i=0;i<5;++i){for (int j=0;j<6;++j){if(j>0)printf(" ");printf("%d",ans[i][j]);}printf("\n");}}return 0;}


原创粉丝点击