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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

kuangbin专题一——Fliptile

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kuangbin专题一——Fliptile 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:Fliptile

題目描述:一個nm得網格,每個網格可以是黑色也可以是白色(黑色為1,白色為0),現在可以翻轉任何一塊網格,使得其本身以及上下左右五塊網格變色(黑變成白,白變成黑),問最少幾次能讓所有網格都是白色。
題解:首先要知道得是,每一塊網格,只有兩種狀態,要不翻轉他,要不不翻轉他,那么一共有2的nm種情況,所以普通的搜索肯定行不通。然而,我們發現,能翻轉某一塊的網格的顏色的只有跟他有接觸的(上下左右)以及他自己,那么我們就可以先讓他上一行全部變成白色(這樣就沒有其他網格能讓他重新變黑了),那么我們只需要枚舉第一行所有的情況(每一個網格翻轉或者不翻轉,復雜度為2的n次方),然后在用下一行去讓上一行是黑色的變成白色(翻轉t[i+1][j]),以此類推,最后如果第n行在讓第n-1行全部翻轉成白色,而自己也正好全部是白色,那么此方案就是可行的。

#include <iostream> #include <cstring> #include <string.h> #include <cstdio> using namespace std; int t[20][20]; int oldT[20][20]; int book[20][20]; int endBook[20][20]; int n,m; int minn = 0x7f7f7f7f; int ans = -1; void dfs(int k,int change) {if(k > n){return;}int newChange = change;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){t[i][j] = oldT[i][j];}}for(int i = 2;i <= n; i++){for(int j = 1; j <= m; j++){book[i][j] = 0;}}t[1][k] = (1^t[1][k]);t[1][k-1] = (1^t[1][k-1]);t[1][k+1] = (1^t[1][k+1]);t[2][k] = (1^t[2][k]);book[1][k]++;oldT[1][k] = (1^oldT[1][k]);oldT[1][k-1] = (1^oldT[1][k-1]);oldT[1][k+1] = (1^oldT[1][k+1]);oldT[2][k] = (1^oldT[2][k]);newChange++;for(int i = 2; i <= n; i++){for(int j =1; j <= m; j++){if(t[i-1][j] == 1){t[i-1][j] = (1^t[i-1][j]);t[i+1][j] = (1^t[i+1][j]);t[i][j] = (1^t[i][j]);t[i][j-1] = (1^t[i][j-1]);t[i][j+1] = (1^t[i][j+1]);book[i][j]++;newChange++;}}}int g = 0;for(int i = 1; i <= m; i++){if(t[n][i] == 1){g = 1;break;}}if(g == 0){ans = 1;if(newChange < minn){for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){endBook[i][j] = book[i][j];}}minn = newChange;}}dfs(k+1,change+1);newChange = change;for(int i = 2;i <= n; i++){for(int j = 1; j <= m; j++){book[i][j] = 0;}}book[1][k]--;oldT[1][k] = (1^oldT[1][k]);oldT[1][k-1] = (1^oldT[1][k-1]);oldT[1][k+1] = (1^oldT[1][k+1]);oldT[2][k] = (1^oldT[2][k]);for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){t[i][j] = oldT[i][j];}}for(int i = 2; i <= n; i++){for(int j =1; j <= m; j++){if(t[i-1][j] == 1){t[i-1][j] = (1^t[i-1][j]);t[i+1][j] = (1^t[i+1][j]);t[i][j] = (1^t[i][j]);t[i][j-1] = (1^t[i][j-1]);t[i][j+1] = (1^t[i][j+1]);book[i][j]++;newChange++;}}}g = 0;for(int i = 1; i <= m; i++){if(t[n][i] == 1){g = 1;break;}}if(g == 0){ans = 1;if(newChange < minn){for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){endBook[i][j] = book[i][j];}}minn = newChange;}}dfs(k+1,change); } int main() {cin>>n>>m;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin>>oldT[i][j];}}dfs(1,0);if(ans==-1){printf("IMPOSSIBLE\n");}else{for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){if(j==m)printf("%d\n",endBook[i][j]);elseprintf("%d ",endBook[i][j]);}}}return 0; }

寫題遇到的bug:一開始我回溯時用的memset(book),將第一行也給重新標記為0了,導致出錯了,dfs的注意兩點,一是回溯,二是結束條件,一般思路沒出錯的情況下,但出現bug很大原因是這兩個地方出現了問題

總結

以上是生活随笔為你收集整理的kuangbin专题一——Fliptile的全部內容,希望文章能夠幫你解決所遇到的問題。

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