标签:
链接:http://poj.org/problem?id=1753
Flip Game
Description
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题目里是4*4的格子,可以用二进制的0、1表示每个格子的黑白,第i个格子为黑即第i位的二进制数为1。这样16个格子需要16位二进制,即一共有2^16-1个状态。从初始状态开始枚举每一种状态改变16个格子的颜色所能导致的状态。出现16位全1或者全0就输出Impossible。
代码:
#include <iostream> #include <stdio.h> #include <queue> #include <string.h> using namespace std; #define MAXX (1<<16) bool flag[MAXX]; int step[MAXX]; queue<int> que; void input() { int state=0; char ch; int i; for(i=1;i<MAXX;i<<=1) { scanf("%c",&ch); if(ch==‘\n‘) scanf("%c",&ch); if(ch==‘b‘) state+=i; } que.push(state); memset(flag,false,sizeof(flag)); memset(step,0,sizeof(step)); flag[state]=true; //printf("%d ",state); } void change(int n,int state) { int temp=state; if(n-4>=0) state^=(1<<(n-4)); if(n+4<16) state^=(1<<(n+4)); if(n!=0&&n!=4&&n!=8&&n!=12) state^=(1<<(n-1)); if(n!=3&&n!=7&&n!=11&&n!=15) state^=(1<<(n+1)); state^=(1<<n); if(!flag[state]) { flag[state]=true; que.push(state); step[state]=step[temp]+1; } } void getall() { int state; int i; while(!que.empty()) { state=que.front(); if(state==0||state==MAXX-1) { printf("%d\n",step[state]); return; } que.pop(); for(i=0;i<16;i++) { change(i,state); } } printf("Impossible\n"); } int main() { input(); getall(); return 0; }
标签:
原文地址:http://www.cnblogs.com/vwqv/p/5857716.html