度度熊的01世界 DFS

2021-09-12 10:36:32 字數 3995 閱讀 2650

度度熊是乙個喜歡計算機的孩子,在計算機的世界中,所有事物實際上都只由0和1組成。

現在給你乙個n*m的影象,你需要分辨他究竟是0,還是1,或者兩者均不是。

影象0的定義:存在1字元且1字元只能是由乙個連通塊組成,存在且僅存在乙個由0字元組成的連通塊完全被1所包圍。

影象1的定義:存在1字元且1字元只能是由乙個連通塊組成,不存在任何0字元組成的連通塊被1所完全包圍。

連通的含義是,只要連續兩個方塊有公共邊,就看做是連通。

完全包圍的意思是,該連通塊不與邊界相接觸。

input

本題包含若干組測試資料。

每組測試資料報含:

第一行兩個整數n,m表示影象的長與寬。

接下來n行m列將會是只有01組成的字元畫。

滿足1<=n,m<=100

output

如果這個圖是1的話,輸出1;如果是0的話,輸出0,都不是輸出-1。

sample input

32 32

00000000000000000000000000000000

00000000000111111110000000000000

00000000001111111111100000000000

00000000001111111111110000000000

00000000011111111111111000000000

00000000011111100011111000000000

00000000111110000001111000000000

00000000111110000001111100000000

00000000111110000000111110000000

00000001111110000000111110000000

00000001111110000000011111000000

00000001111110000000001111000000

00000001111110000000001111100000

00000001111100000000001111000000

00000001111000000000001111000000

00000001111000000000001111000000

00000001111000000000000111000000

00000000111100000000000111000000

00000000111100000000000111000000

00000000111100000000000111000000

00000001111000000000011110000000

00000001111000000000011110000000

00000000111000000000011110000000

00000000111110000011111110000000

00000000111110001111111100000000

00000000111111111111111000000000

00000000011111111111111000000000

00000000111111111111100000000000

00000000011111111111000000000000

00000000001111111000000000000000

00000000001111100000000000000000

00000000000000000000000000000000

32 32

00000000000000000000000000000000

00000000000000001111110000000000

00000000000000001111111000000000

00000000000000011111111000000000

00000000000000111111111000000000

00000000000000011111111000000000

00000000000000011111111000000000

00000000000000111111110000000000

00000000000000111111100000000000

00000000000001111111100000000000

00000000000001111111110000000000

00000000000001111111110000000000

00000000000001111111100000000000

00000000000011111110000000000000

00000000011111111110000000000000

00000001111111111111000000000000

00000011111111111111000000000000

00000011111111111111000000000000

00000011111111111110000000000000

00000000001111111111000000000000

00000000000000111111000000000000

00000000000001111111000000000000

00000000000111111110000000000000

00000000000011111111000000000000

00000000000011111111000000000000

00000000000011111111100000000000

00000000000011111111100000000000

00000000000000111111110000000000

00000000000000001111111111000000

00000000000000001111111111000000

00000000000000000111111111000000

00000000000000000000000000000000

3 3101

101011

sample output01

-1大體意思就是判斷輸入的這個巨型地圖是0還是1,乍一看很懵,實際上就是搜尋可以解決的問題。從0和1的定義出發,0是存在1字元且1字元只能是由乙個連通塊組成,存在且僅存在乙個由0字元組成的連通塊完全被1所包圍,也就是說只存在乙個1的連通分支且只有乙個0的連通分支被1的連通分支包圍,而對於1連通分支外面的並沒有要求,所以0的條件就是只有乙個1包圍乙個內圈0,並不需要想太多,而1的要求是說存在1字元且1字元只能是由乙個連通塊組成,不存在任何0字元組成的連通塊被1所完全包圍,即沒有任何內圈0只有乙個1連通分支,其餘情況就全是-1了。理解好定義就可以對常見的求連通分支數的dfs進行拓展,主要是處理好內圈0和外圈0的判斷,這裡參考了網上的做法,不需要bfs,在搜尋時,如果下乙個位置是越界的,且當前位置是0,那麼這就是外圈0,對應的,如果所有情況都沒有越界,這種情況就是內圈0。

ac**

#include#include#includeusing namespace std;

int map[105][105];

int vis[105][105];

int dir[4][2]=;

int n,m;

int flag=1;

void dfs(int x,int y)

if(vis[tx][ty]==1) continue;

if(map[tx][ty]!=map[x][y]) continue;

vis[tx][ty]=1;

dfs(tx,ty);

}}int main()

getchar();

}

for(int i=0;i}

} if(cnt1!=1) cout<<"-1"

}return 0;

}

HDU 6113 度度熊的01世界(dfs)

題目 這裡寫鏈結內容 思路 在n m影象周圍圍一圈 0 然後找0和1的聯通塊數,1聯通塊數肯定為1才行 0聯通塊數如果滿足 影象0的定義 那麼必須只有兩個聯通塊,滿足 影象1的定義 必須只有乙個聯通塊。include using namespace std const int n 105 char ...

HDU 6113 度度熊的01世界 暴力dfs)

因為條件是存在乙個1的聯通塊包含著乙個0的聯通快的才是0所以,我們先預處理邊界,對於0的邊界處理成以訪問過,對於邊界是1的不做操作。然後暴力判斷每個點是否訪問過來進行dfs求聯通塊的個數,如果0的個數和1的個數都是1,那麼可以肯定影象為0,如果0的個數是0,1的個數是1,那麼影象為1。include...

hdu6113度度熊的01世界 dfs求連通塊

題意 度度熊是乙個喜歡計算機的孩子,在計算機的世界中,所有事物實際上都只由0和1組成。現在給你乙個n m的影象,你需要分辨他究竟是0,還是1,或者兩者均不是。影象0的定義 存在1字元且1字元只能是由乙個連通塊組成,存在且僅存在乙個由0字元組成的連通塊完全被1所包圍。影象1的定義 存在1字元且1字元只...