ACM訓練集 洛谷 P1162 填塗顏色

2021-10-08 17:02:37 字數 2716 閱讀 9134

題目描述

由數字0組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2.例如:6×6的方陣(n=6n=6),塗色前和塗色後的方陣如下:

0 0 0 0 0 0

0 0 1 1 1 1

0 1 1 0 0 1

1 1 0 0 0 1

1 0 0 0 0 1

1 1 1 1 1 1

0 0 0 0 0 0

0 0 1 1 1 1

0 1 1 2 2 1

1 1 2 2 2 1

1 2 2 2 2 1

1 1 1 1 1 1

輸入格式每組測試資料第一行乙個整數n(1≤n≤30)

接下來n行,由0和1組成的n×n的方陣。

方陣內只有乙個閉合圈,圈內至少有乙個0。

輸出格式

已經填好數字2的完整方陣。

輸入輸出樣例

輸入

6

0 0 0 0 0 0

0 0 1 1 1 1

0 1 1 0 0 1

1 1 0 0 0 1

1 0 0 0 0 1

1 1 1 1 1 1

輸出

0 0 0 0 0 0

0 0 1 1 1 1

0 1 1 2 2 1

1 1 2 2 2 1

1 2 2 2 2 1

1 1 1 1 1 1

說明/提示:1 ≤ n ≤ 30

解題思路:

難點1:我們不太好判斷0有沒有被1所圍住,所以我們需要換一種思路,看能不能找出沒有被1圍住的0,並對他們做上標記,例如將0變成2;此時我們可以從第乙個沒有被圍住的0開始,一直遍歷每個點,遇到0就將其變成2,遇到1或2就返回,最後剩下的0就是被圍住的0

難點2:因為我們不知道 第乙個沒有被圍住的0 會出現在哪個位置,所以我們不能很方便的從某乙個點開始遍歷。此時我們可以擴大該矩陣,即在矩陣的四周都加上0,這樣我們就可以保證在i=0,j=0的位置是沒有被1圍住的

ac**—dfs方式

#include

using namespace std;

int n, a[32]

[32];

void

dfs(

int i,

int j)

, y[4]

=;// 新增標記

a[i]

[j]=2;

for(

int k =

0; k <

4; k++)}

}int

main()

}// c++開陣列時元素的值預設是0,這兩個for可省略

for(j =

0; j <= n +

1; j++

)for

(i =

0; i <= n +

1; i++

)dfs(0

,0);

for(i =

1; i <= n; i++)}

cout << endl;

}return0;

}

ac**—bfs方式

#include

#include

using namespace std;

int n, a[32]

[32];

struct point

;void

bfs(

), y[4]

=;// 每個方向都遍歷一次

for(

int i =

0; i <

4; i++)}

}}intmain()

}bfs()

;for

(i =

1; i <= n; i++)}

cout << endl;

}return0;

}

兩者的執行效率如圖:(24ms的是dfs,22ms的是bfs)

總結:

bfs比dfs**更多一些,所需的空間多一些,但bfs所需的時間比較少,效能感覺也比較好。

bfs一般與佇列queue掛鉤,因為他是從一層層遍歷的。

tips:

dfs有個致命缺點,如果深度很深,就會出現棧溢位,或者超時的情況。(因為有些題目就會卡dfs的深度,比如讓你在10w*10的矩陣中找乙個元素,而該元素就在矩陣的前部分,但此時dfs就會一直搜尋到10w深的地方,而bfs一下子就可以找到該元素了)

洛谷P1162 填塗顏色

由數字0組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2.例如 6 6的方陣 n 6 塗色前和塗色後的方陣如下 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1...

填塗顏色 洛谷P1162

由數字0組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2.例如 6 6的方陣 n 6 塗色前和塗色後的方陣如下 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1...

洛谷P1162 填塗顏色

題目描述 由數字0組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2,例如 6 6的方陣 n 6 塗色前和塗色後的方陣如下 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 ...