标准的广搜题目。
大致题意,一个4X4的矩形中有黑白棋子。点一下会使自己变成另一种颜色,与其相邻的也会发生同样的变化。
问:最少经过多少次可以使盘面上的颜色达到一致?
/************************************************************************/ /* 0.是否达到要求 1.是否在盘中 2.判重 3.符合要求 4.更改 */ /************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #define INF 0x3fffffff #define maxn 65536+5 #define LEN 4 int N; int vis[maxn]; char maps[4][5]; int q[maxn]; int front,rear; int fx[4][2]={-1,0, 1,0, 0,-1, 0,1}; int IsInBound(int r,int l) { if(r<0 || r>LEN-1 || l<0 || l>LEN-1) return 0; return 1; } void Enque(int r,int l,int num) { int i,k; int rr,ll; k=num; num^=1<<(r*4+l); for(i=0;i<LEN;i++)//这里出错了下,理解错了题意,是所有相邻的都改而不是每个改后都为一个新状态 { rr=r+fx[i][0]; ll=l+fx[i][1]; if(IsInBound(rr,ll)) num^=1<<(rr*4+ll); } if(!vis[num]) { q[rear++]=num; rear%=(maxn); vis[num]=vis[k]+1; } } int bfs() { int i,j,k; for(k=i=0;i<LEN;i++) for(j=0;j<LEN;j++) if(maps[i][j]=='w') k^=1<<(i*LEN+j); rear=1; front=0; q[front]=k; memset(vis,0,sizeof(vis)); vis[k]=1; while(front!=rear) { k=q[front++]; front%=(maxn); if(k==0 || k==0xffff) return vis[k]-1; for(i=0;i<LEN;i++) for(j=0;j<LEN;j++) Enque(i,j,k); } return -1; } int main() { int i,j,tot; for(i=0;i<4;i++) scanf("%s",maps[i]); tot=bfs(); if(tot!=-1) printf("%d\n",tot); else printf("Impossible\n"); return 0; }
POJ 1753 Flip Game,布布扣,bubuko.com
原文:http://blog.csdn.net/gg_gogoing/article/details/38610847