日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)

發布時間:2024/6/14 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1753 Flip Game (黑白棋) (状态压缩+BFS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意:有一個4*4的方格,每個方格中放一粒棋子,這個棋子一面是白色,一面是黑色。游戲規則為每次任選16顆中的一顆,把選中的這顆以及它四周的棋子一并反過來,當所有的棋子都是同一個顏色朝上時,游戲就完成了。現在給定一個初始狀態,要求輸出能夠完成游戲所需翻轉的最小次數,如果初始狀態已經達到要求輸出0。如果不可能完成游戲,輸出Impossible。

主要思想:

1.如果用一個4*4的數組存儲每一種狀態,不但存儲空間很大,而且在窮舉狀態時也不方便記錄。因為每一顆棋子都只有兩種狀態,所以可以用二進制0和1表示每一個棋子的狀態,則棋盤的狀態就可以用一個16位的整數唯一標識。而翻轉的操作也可以通過通過位操作來完成。顯然當棋盤狀態id為0(全白)或65535(全黑)時,游戲結束。

2.對于棋盤的每一個狀態,都有十六種操作,首先要判斷這十六種操作之后是否有完成的情況,如果沒有,則再對這十六種操作的結果分別再進行上述操作,顯然這里就要用到隊列來存儲了。而且在翻轉的過程中有可能會回到之前的某種狀態,而這種重復的狀態是不應該再次入隊的,所以維護isVis[i]數組來判斷id==i的狀態之前是否已經出現過,如果不是才將其入隊。如果游戲無法完成,狀態必定會形成循環,由于重復狀態不會再次入隊,所以最后的隊列一定會是空隊列。

3.由于0^1=1,1^1=0,所以翻轉的操作可以通過異或操作來完成,而翻轉的位置可以通過移位來確定。

# include <iostream># define N 65536using namespace std;int q[N*2];int front, rear, i, j, id = 0, tmp;bool vis[N]; //標記狀態是否出現過int step[N]; //記錄到達id==i時狀態翻轉所需次數char color; int main(void){for(i = 0; i < 4; i++)for(j = 0; j < 4; j++){cin >> color; //輸入初始狀態并轉換為idid <<= 1;if(color == 'b')id++;}if(id == 0 || id == 65535){cout << 0 << endl; //如果初始狀態滿足直接輸出return 0;}q[rear++] = id; //初始狀態id入隊vis[id] = true;step[id] = 0; //到達初始狀態所需次數置0while(front < rear) //隊列不為空繼續操作 {id = q[front++]; //隊頭元素出隊for(i = 0; i < 4; i++)for(j = 0; j < 4; j++){tmp = id; //需要遍歷隊頭元素的16種操作 每次還原tmpif(i == 0)tmp ^= 1 << (11-4*i-j); //翻轉的位置為15-(4*(i+1)+j)else if(i == 3)tmp ^= 1 << (19-4*i-j); //翻轉的位置為15-(4*(i-1)+j)else{tmp ^= 1 << (11-4*i-j);tmp ^= 1 << (19-4*i-j);}if(j == 0)tmp ^= 3 << (14-4*i-j); //翻轉的位置為15-(4*i+j)、15-(4*i+j+1)else if(j == 3)tmp ^= 3 << (15-4*i-j); //翻轉的位置為15-(4*i+j-1)、15-(4*i+j)else{tmp ^= 7 << (14-4*i-j); //翻轉的位置為15-(4*i+j-1)、15-(4*i+j)、15-(4*i+j+1) }if(tmp == 0 || tmp == 65535){cout << step[id]+1 << endl;return 0;}if(!vis[tmp]) //如果是新狀態 入隊 {q[rear++] = tmp;vis[tmp] = true;step[tmp] = step[id]+1; // 當前次數=到達隊頭元素所需次數+1 }}}cout << "Impossible" << endl;return 0;} View Code

?

后記:

第一次做狀態壓縮的題,也是現學現賣,有些像位運算的公式什么的還是理解的不是很透徹,關于狀態壓縮的題還是需要再多做幾個。

?

轉載于:https://www.cnblogs.com/Silence-AC/p/3234199.html

總結

以上是生活随笔為你收集整理的POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产av天堂无码一区二区三区 | 天天色影综合网 | 波多野结衣免费视频观看 | 一区二区伦理 | 日韩高清不卡在线 | 美脚の诱脚舐め脚视频播放 | 香蕉视频一级片 | 国产人成在线观看 | 国产一区一区 | 天堂av观看| 麻豆精品国产精华精华液好用吗 | 福利91 | 成人性生交免费看 | 一久久久久 | 久久国产精品久久国产精品 | 免费黄色av网站 | 中文字幕日韩欧美一区二区 | 亚洲国产三区 | 91麻豆精品国产91久久久久久久久 | 亚洲系列中文字幕 | 99这里有精品 | а天堂中文在线官网 | 久久精品99国产精品日本 | 正在播放国产一区 | 欧美a一级片| 啪啪国产精品 | 亚洲a在线观看 | 动漫涩涩免费网站在线看 | 久久在线免费 | 尤物视频在线观看国产 | 日本熟女一区二区 | 久久久久在线视频 | 日韩欧美网 | 少妇高潮伦 | 影音先锋成人资源 | 蜜桃视频在线入口www | 爱爱爱免费视频 | 伊人久久大香线蕉综合75 | 日本免费福利视频 | 青青草免费公开视频 | 性欧美videossex精品 | 黑人添美女bbb添高潮了 | 日本一区二区三区视频在线 | 久久久久人妻精品一区二区三区 | 亚洲AV无码一区二区三区少妇 | 少妇一区二区视频 | 色欲色香天天天综合网www | 亚洲高清视频网站 | 麻豆网站在线观看 | 国产精品一二区在线观看 | 国产精品宾馆在线精品酒店 | 亚洲性色图| 亚洲国产精品成人综合在线 | 中文不卡在线 | 亚洲欧洲日韩国产 | 日本欧美色 | 国产欧美视频在线播放 | 国产日韩成人内射视频 | 九九热免费 | 韩国av一区二区三区 | 在线观看av免费 | 中文字幕网站在线观看 | av久操| 99re在线播放| 欧美综合日韩 | 啪视频在线观看 | 欧美激情精品 | 成人免费视频网站在线观看 | 欧美日韩国产亚洲沙发 | 日日摸天天爽天天爽视频 | 久久午夜影院 | 久久久91精品国产一区二区三区 | 日韩avv| 国内外成人免费视频 | 视频一区二区中文字幕 | 国产福利小视频在线观看 | 天堂网av中文字幕 | 久久女同 | 黄色成人毛片 | 激情婷婷久久 | 久久久男人天堂 | 嫩草伊人久久精品少妇av | 中文亚洲av片不卡在线观看 | 黄页网站视频 | 欧美成人动态图 | 伊人精品在线观看 | 日韩欧美中文字幕一区二区 | 久久久123| 亚洲性免费 | 激情av一区 | 亚洲一区二区免费在线观看 | 国产精品永久 | 亚洲人成7777| 少妇人妻一区二区三区 | 精品少妇无码av无码专区 | 91人人草| 激情专区 | 在线黄色观看 | 男人添女人荫蒂国产 |