DFS連通塊 NYOJ水池數目
阿新 • • 發佈:2018-12-13
題目描述
校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。
輸入
第一行輸入一個整數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
程式碼
#include<stdio.h>
#include<string.h>
int mp[105][105],vis[105][105];
int m,n;
int mv[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int x,int y,int id)
{
if(x<0||x>=m||y<0||y>=n) return; //判斷是否越界
if(vis[x][y]>0||mp[x][y]!=1) return;
vis[x][y]=id; //連通分量標號
for(int i=0;i< 4;i++)
{
int dx=x+mv[i][0];
int dy=y+mv[i][1];
dfs(dx,dy,id);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(mp,0,sizeof(mp));
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++) //初始化地圖
{
for(int j=0;j<n;j++)
{
scanf("%d",&mp[i][j]);
}
}
memset(vis,0,sizeof(vis));
int cur=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(vis[i][j]==0&&mp[i][j]==1)
{
cur+=1; //記錄下一組連通分量
dfs(i,j,cur);
}
}
}
printf("%d\n",cur);
}
return 0;
}