dfs 聯通塊 水池數目
阿新 • • 發佈:2018-11-06
nyoj地址:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=27
水池數目
時間限制:3000 ms | 記憶體限制:65535 KB
難度:4
描述
南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。
輸入
第一行輸入一個整數N,表示共有N組測試資料
每一組資料都是先輸入該地圖的行數m(0<m<100)與列數n(0<n<100),然後,輸入接下來的m行每行輸入n個數,表示此處有水還是沒水(1表示此處是水池,0表示此處是地面)
輸出
輸出該地圖中水池的個數。
要注意,每個水池的旁邊(上下左右四個位置)如果還是水池的話的話,它們可以看做是同一個水池。
樣例輸入
2
3 4
1 0 0 0
0 0 1 1
1 1 1 0
5 5
1 1 1 1 0
0 0 1 0 1
0 0 0 0 0
1 1 1 0 0
0 0 1 1 1
樣例輸出
2
3
大水題 dfs 聯通塊
直接搜 ,標記處理好就ok了。
#include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<iostream> #include<stdlib.h> using namespace std; const int inf=0x3f3f3f3f; const int maxn=105; int e[maxn][maxn]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int m,n,ans; int judge(int x,int y){ if(x<0||x>m-1||y<0||y>n-1||e[x][y]==0) return 0; return 1; } void dfs(int x,int y){ e[x][y]=0; for(int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if(judge(nx,ny)){ dfs(nx,ny); } } } int main(){ int t; cin>>t; while(t--){ cin>>m>>n; for(int i=0;i<m;i++) for(int j=0;j<n;j++) cin>>e[i][j]; ans=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++){ if(e[i][j]==1){ ans++; dfs(i,j); } } cout<<ans<<endl; } return 0; }