Flip Game(枚举)
生活随笔
收集整理的這篇文章主要介紹了
Flip Game(枚举)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
~題目鏈接~
http://poj.org/problem?id=1753
可參考大神題解(位運算):http://www.cnblogs.com/tanhehe/archive/2013/06/11/3131615.html
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??http://www.cnblogs.com/kuangbin/archive/2011/07/30/2121677.html
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??http://poj.org/showmessage?message_id=340320
輸入
bwwb bbwb bwwb bwww結果
4?位運算+隊列
? 知識點:
? ^ 異或,1^1=0,1^0=1
?
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 65535+10 #include<queue>using namespace std;int data,vis[maxn];struct node {int rond,step; } N;int sreach() {queue<node>Q;N.rond=data;N.step=0;Q.push(N);vis[N.rond]=1;//標記這種形式的已訪問if(data==0 || data==65535)return N.step;while(!Q.empty()){for(int i=0; i<16; i++)//從最后一位開始變換,并記錄{N.rond=Q.front().rond^(1<<i);//此位點翻轉if(i<12)N.rond^=1<<(i+4);//此位點上側點翻轉if(i>=4)N.rond^=1<<(i-4);//此位點下側點翻轉if(i%4!=0)N.rond^=1<<(i-1);//此位點左側點翻轉if(i%4!=3)N.rond^=1<<(i+1);//此位點右側點翻轉if(!vis[N.rond])//判斷是否被訪問過{N.step=Q.front().step+1;Q.push(N);vis[N.rond]=1;}if(N.rond==0 || N.rond==65535)return N.step;}Q.pop();}return -1;//不能轉換 }int main() {char s;for(int i=1; i<=4; i++){for(int j=1; j<=4; j++){data*=2;scanf("%c",&s);if(s=='b')data+=1;//轉換成數據}getchar();}int x=sreach();if(x==-1)printf("Impossible\n");elseprintf("%d\n",x);return 0; }
?附帶~測試數據(測試數據過,穩過)
bwbw wwww bbwb bwwb Impossible bwwb bbwb bwwb bwww 4 wwww wwww wwww wwww 0 bbbb bbbb bbbb bbbb 0 bbbb bwbb bbbb bbbb Impossible bwbb bwbb bwbb bbbb Impossible bwbb wwwb bwbb bbbb 1 wwww wwwb wwbb wwwb 1 wwww wwww wwwb wwbb 1 wbwb bwbw wbwb bwbw Impossible bbbb bwwb bwwb bbbb 4 bwwb wbbw wbbw bwwb 4 bbww bbww wwbb wwbb Impossible bbwb bbbw wwbb wwwb Impossible wwwb wwbw wbww wwbw Impossible bbbb wwww wwbb wbbb Impossible bwwb wbwb wbbb wbbb 4 bwbb bwbb bwbw bbbw 5 wbwb bbbb bbww wbbb 6 bbwb bbbb wbwb bbbb 5
轉載于:https://www.cnblogs.com/guoyongzhi/p/3233063.html
總結
以上是生活随笔為你收集整理的Flip Game(枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux.bash脚本编写基础
- 下一篇: 为什么计算机关机慢,XP系统为什么电脑关