深搜 ,廣搜,佇列 nyoj 27 水池數目
阿新 • • 發佈:2019-02-08
水池數目
時間限制: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
- 來源
- 上傳者
因為周賽 碰見了搜尋就犯怵,要加強練習,將能想到的解法都嘗試著寫寫!!!
這道題廣搜深搜都是可以的,深搜的話,當然還是比較簡短的!
稍微簡化一點的版本://最常見的版本 #include<stdio.h> int map[110][110]; void dfs(int i,int j) { if(map[i-1][j]){map[i-1][j]=0;dfs(i-1,j);} if(map[i+1][j]){map[i+1][j]=0;dfs(i+1,j); } if(map[i][j+1]){ map[i][j+1]=0;dfs(i,j+1); } if(map[i][j-1]) { map[i][j-1]=0;dfs(i,j-1); } } int main() { int t; int i,j; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) { for(j=1;j<=m;++j) { scanf("%d",&map[i][j]); } } int cnt=0; for(i=1;i<=n;++i) { for(j=1;j<=m;++j) { if(map[i][j]) { map[i][j]=0; cnt++; dfs(i,j); } } } printf("%d\n",cnt); } return 0; }
試了一下廣搜,發現也可以!#include<stdio.h> #include<string.h> int b[2][4]={0,1,0,-1,1,0,-1,0}; int map[110][110]; void dfs(int x,int y) { map[x][y]=0; for(int i=0;i<4;++i) { if(map[x+b[0][i]][y+b[1][i]]) { dfs(x+b[0][i],y+b[1][i]); } } } int main() { int t; scanf("%d",&t); while(t--) { int n,m; int cnt=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { scanf("%d",&map[i][j]); } } for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(map[i][j]) { cnt++; dfs(i,j); } } } printf("%d\n",cnt); } return 0; }
//法三: #include<stdio.h> #include<queue> using namespace std; typedef struct { int i,j; }node; int map[110][110]; int cnt; int b[2][4]={0,1,0,-1,1,0,-1,0}; queue<node>q; int n,m; void bfs() { for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(map[i][j]) { map[i][j]=0; node u={i,j}; q.push(u); cnt++; while(!q.empty()) { u=q.front(); q.pop(); for(int k=0;k<4;++k) { if(map[u.i+b[0][k]][u.j+b[1][k]]) { node v={u.i+b[0][k],u.j+b[1][k]}; q.push(v); map[v.i][v.j]=0; } } } while(!q.empty()) q.pop(); } } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { scanf("%d",&map[i][j]); } } cnt=0; bfs(); printf("%d\n",cnt); } return 0; }