1. 程式人生 > >DFS連通塊 NYOJ水池數目

DFS連通塊 NYOJ水池數目

題目描述

校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。

輸入

第一行輸入一個整數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; }