poj2965深搜+枚举

来源:互联网 发布:xilinx mac 编辑:程序博客网 时间:2024/05/22 17:19

本题大致与poj1753相同,唯一难点是记录翻转过程,其他详见poj1753

//Memory   Time//132K     610ms#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct node{//用来储存过程 int row,col;}p[16];int chess[4][4];int step;int flag;int judge()//判断是否打开 {for(int i=0;i<4;i++)for(int j=0;j<4;j++)if(chess[i][j]!=1)return 0;return 1;}void reverse(int row,int col)//翻转开关 {for(int i=0;i<4;i++){if(chess[row][i]==1)chess[row][i]=0;elsechess[row][i]=1;}for(int i=0;i<4;i++){if(i!=row){if(chess[i][col]==1)chess[i][col]=0;elsechess[i][col]=1;}}}int dfs(int row,int col,int deep){if(deep==step){return flag=judge();}if(flag||row>=4)return 0;reverse(row,col);p[deep].row=row+1;//记录过程 p[deep].col=col+1;if(col<3)dfs(row,col+1,deep+1);elsedfs(row+1,0,deep+1);reverse(row,col);//若前面的行不通则开关复位 if(col<3)dfs(row,col+1,deep);elsedfs(row+1,0,deep); }int main(){char t; for(int i=0;i<4;i++){for(int j=0;j<4;j++){scanf("%c",&t);if(t=='-')chess[i][j]=1;elsechess[i][j]=0;}getchar();}for(step=0;step<=16;step++)//为什么最大步数为16 详见poj1753 {dfs(0,0,0);if(flag){printf("%d\n",step);break;}}for(int i=0;i<step;i++)printf("%d %d\n",p[i].row,p[i].col);return 0;}

0 0
原创粉丝点击