洛谷 P1162 填塗顏色(bfs)

2021-10-19 19:19:24 字數 1508 閱讀 5604

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

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

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

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

//感謝黃小u飲品指出本題資料和資料格式不一樣. 已修改(輸入格式)

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

本題看似是乙個判斷閉合環的dfs,但是菜雞的我並沒有想出用dfs判斷出閉合1環後如何快速檢索環內的元素。

所以就換了乙個思路,首先可以發現map中的0分為兩類,一類是1環內的,另一類是可以聯通到邊界的,所以我只需要判斷出與邊界聯通的0,讓其它的0變為2就可以了。所以我用另外乙個陣列把與邊界聯通的0全部改為1,然後這其中0的索引就是原map要輸出2的索引。

這個思路明了多了,現在就是判斷與邊界聯通的0了,用for遍歷map的外邊界,檢索到0就bfs(因為結束條件不明確)並把聯通0改為1;如果邊界沒有0,那就更簡單了,直接把原map是0的地方改為2即可。

**有點冗長,但是感覺思路很好。

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

class

node

;int ma[40]

[40];

int ansma[40]

[40];

int n;

int changex[4]

=;int changey[4]

=;bool ju =

false

;queue q;

node no;

void

bfs()}

}}intmain()

}for

(int i =

0;i < n;i++

)else

if(ma[i]

[n -1]

==0)break;}

else}}

}if(ju)

else

} cout

else

} cout

}

BFS 洛谷P1162填塗顏色

題目 題解 解法一 bfs includeusing namespace std const int m 31 bool vis m m int n,m,a,b,c,map m m queue q void bfs int x,int y int main for int i 1 i n i i n...

洛谷P1162 填塗顏色 bfs

題目鏈結 題意 有乙個0和1組成的矩陣,一些1組成乙個閉合圈,圈住一些0,現在要把被圈住的這些0變成2輸出。思路 bfs,判斷每個0可以到達的邊界。如果這個0是可以到達矩陣的邊界的說明沒有被圈住。bfs時不把1加入佇列,如果最後也不能到達邊界說明是被圈住的,變成2就行了。1 include2 inc...

洛谷p1162填塗顏色(bfs題目)

原題 本題是我第乙個用bfs的題目,bfs是隊裡的shawnzhou大佬教我的,在這裡先感謝他一下啦 這個題的思路也是他提供的,還是需要一定的練習才行鴨!對於本題來說的話,先將外面的0塗成2 然後遍歷圖,將0和2塗反色就可以了 注意bfs的使用哦 實現 include using namespace...