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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Codevs] 1014 棋盘染色

發布時間:2024/7/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Codevs] 1014 棋盘染色 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1049 棋盤染色

?時間限制: 1 s ?空間限制: 128000 KB ?題目等級 : 黃金 Gold 題目描述?Description

有一個5×5的棋盤,上面有一些格子被染成了黑色,其他的格子都是白色,你的任務的對棋盤一些格子進行染色,使得所有的黑色格子能連成一塊,并且你染色的格子數目要最少。讀入一個初始棋盤的狀態,輸出最少需要對多少個格子進行染色,才能使得所有的黑色格子都連成一塊。(注:連接是指上下左右四個方向,如果兩個黑色格子只共有一個點,那么不算連接)

?

輸入描述?Input Description

? ?輸入包括一個5×5的01矩陣,中間無空格,1表示格子已經被染成黑色。

?

輸出描述?Output Description

輸出最少需要對多少個格子進行染色

?

樣例輸入?Sample Input

11100

11000

10000

01111

11111

?

樣例輸出?Sample Output

1

?

分析 Analysis

思維級模版題= =。

判重:HASH蛤習

判斷輸出:DFS求聯通塊

主體:BFS

注意點:狀態表示

主要還是數據范圍小= =感謝出題人放我蒟蒻一馬Orz

?

代碼 Code

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 #define LL long long 6 using namespace std; 7 8 const int dir[4][2] = {{0,1},{1,0},{-1,0},{0,-1}}; 9 10 bool swi = true; 11 12 struct MAP{ 13 int map[7][7],step,remain; 14 15 MAP(){ 16 memset(map,0,sizeof(map)); 17 step = remain = 0; 18 } 19 }; 20 21 queue<MAP> q; 22 23 bool HASH[21473650]; 24 25 LL GETHASH(MAP now){ 26 LL code = 0; 27 for(int i = 1;i <= 5;i++){ 28 for(int j = 1;j <= 5;j++){ 29 code = (code<<1)+now.map[i][j]; 30 } 31 } 32 33 return code%21473648; 34 } 35 36 bool poicheck(int x,int y){ 37 if(x > 5 || x < 1 || y > 5 || y < 1) return false; 38 else return true; 39 } 40 41 int tot = 0; 42 bool chess[6][6]; 43 void dfs(int x,int y,MAP now){ 44 if(chess[x][y] || !now.map[x][y] || !poicheck(x,y)) return; 45 chess[x][y] = true; 46 tot++; 47 for(int i = 0;i < 4;i++){ 48 int nowx = x+dir[i][0]; 49 int nowy = y+dir[i][1]; 50 dfs(nowx,nowy,now); 51 } 52 } 53 54 bool check(MAP now){ 55 int x,y; 56 for(int i = 1;i <= 5;i++){ 57 for(int j = 1;j <= 5;j++){ 58 if(now.map[i][j]){ 59 x = i,y = j; 60 break; 61 } 62 } 63 } 64 65 memset(chess,false,sizeof(chess)); 66 tot = 0; 67 dfs(x,y,now); 68 69 if(tot == 25-now.remain) return true; 70 else return false; 71 } 72 73 void Input(){ 74 MAP tmp; 75 76 for(int i = 1;i <= 5;i++){ 77 for(int j = 1;j <= 5;j++){ 78 scanf("%1d",&tmp.map[i][j]); 79 if(!tmp.map[i][j]) tmp.remain++; 80 } 81 } 82 83 tmp.step = 0; 84 85 86 87 q.push(tmp); 88 } 89 90 void PUSH(MAP now){ 91 now.step++;now.remain--; 92 for(int i = 1;i <= 5;i++){ 93 for(int j = 1;j <= 5;j++){ 94 if(!now.map[i][j]){ 95 now.map[i][j] = 1; 96 97 LL code = GETHASH(now); 98 99 if(HASH[code]){ 100 now.map[i][j] = 0; 101 continue; 102 }else HASH[code] = 1; 103 104 if(check(now)){ 105 printf("%d",now.step); 106 swi = false; 107 return; 108 } 109 q.push(now); 110 now.map[i][j] = 0; 111 } 112 } 113 } 114 } 115 116 void bfs(){ 117 while(!q.empty() && swi){ 118 MAP tmp = q.front(); 119 q.pop(); 120 // cout << 'A'; 121 if(check(tmp)){ 122 printf("%d",tmp.step); 123 swi = false; 124 return; 125 } 126 127 PUSH(tmp); 128 } 129 } 130 131 int main(){ 132 133 Input(); 134 bfs(); 135 136 return 0; 137 } A tired day = =

?

轉載于:https://www.cnblogs.com/Chorolop/p/7327877.html

總結

以上是生活随笔為你收集整理的[Codevs] 1014 棋盘染色的全部內容,希望文章能夠幫你解決所遇到的問題。

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