C 廣搜基礎例題 填塗顏色

2021-09-29 17:44:38 字數 2429 閱讀 6691

洛谷p1162

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

輸入格式

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

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

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

輸出格式

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

輸入

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

原始碼如下:

#include

using

namespace std;

int a[32]

[32], b[32]

[32];

int dx[5]

=;int dy[5]

=;int n, i, j;

void

dfs(

int p,

int q)

intmain()

dfs(0,

0);for

(i =

1; i <= n; i++

)}

思路引導:應該是不難看出來這是一道基礎的廣度優先搜尋的題目,也就是bfs,問題的本質就是將牆內的值分開,至於牆和牆外,我們按照原來輸出就可以。首先我們將二維陣列資料儲存在二維陣列a中,有一點需要注意就是,不能從(0,0)開始存,從(0,0)開始存的話,在後面搜尋進行的時候,會出現陣列越界的問題,另外定義另乙個陣列b用來表示我們01圖的各個元素的狀態,如果是a對應的位置是牆,則將b對應位置染色為1,反之染色為0。

for

(i =

1; i <= n; i++

)for

(j =

1; j <= n; j++

)

然後從(0,0)出發,開始遍歷搜尋,如果遇到牆,或者到達陣列的邊界,才返回。

if

(p<

0|| p>n +

1|| q<

0|| q>n +

1|| b[p]

[q]!=0)

return

;

如果沒有返回,也就是這個位置對應陣列a的值為0,即不為牆且不為牆內,然後對這個位置進行染色,其實就是將牆外的位置也變置為牆,這一步染色很重要,如果沒有染色,在進入下乙個位置後,程式往上下左右進行遍歷時,沒有標誌能提示給程式上乙個位置是否已經被遍歷過了,程式就會再一次進入之前遍歷過的那個位置,也即又回到了(0,0),這也是我同學之前遇到的問題,始終無法跳出函式。

void

dfs(

int p,

int q)

接著就是上一步說的,在初始位置染色後,我們往上下左右(通過兩個陣列實現)四個方向進行遍歷,每次遍歷乙個方向,就相當於再次跳進乙個位置的bfs函式中,遞迴,一直到所有的非牆內的位置都被遍歷並且染色,變置為牆。

此時在陣列b中,除了值為0點位置,其他位置都變置為牆了,也就是,除了牆內的位置,其他位置都為1,那麼問題也就解決了,輸出:

for

(i =

1; i <= n; i++

)

總的來說,題目是一道比較為基礎的廣搜題,而最為主要的地方就是,定義另乙個陣列復刻原來的陣列,對這個陣列進行染色,區分出要改變值的地方。

對於不需要改變的按照a陣列原樣輸出,對於要改變的,通過b陣列識別判斷,輸出題目要求的對應值,也就完成啦。

題目本身也是不太難,希望能幫到剛要學習廣度搜尋的同學,謝謝瀏覽啦!

深搜與廣搜以及例題

做題目的時候,遇見了兩個型別十分相似的題目,可以乙個直接輸出最短的步數,乙個要儲存,這個就很犯難 然後通過這兩題,有重新了解了乙個bfs與dfs的區別 一 路徑的輸出 1.dfs dfs其實就是一直順著乙個方向不斷的搜尋知道找到了目標為止。路徑輸出的時候,利用記錄前面的點即可 include inc...

學霸的迷宮 廣搜例題

題目鏈結 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...

C 演算法 廣搜

有乙個同學推薦我寫一下廣搜,廣搜在最短路 騙分 上確實也有突出貢獻,普及組應該也會考到,我今天就給要考普及組的同學講講課,今天講廣搜。廣搜,把可以走到的地點存進佇列,然後乙個個走,所以他第一次走到乙個點時的步數,一定是開始位置和這個點的最短步數,因為他會把所有路徑都加進去,所以第一次碰到的一定是最短...