NYOJ 27 水池數目 深搜或廣搜
阿新 • • 發佈:2019-02-17
題目很簡單是最基礎的搜尋題
首先是深搜寫法,遞迴
廣搜寫法,佇列#include<stdio.h> #include<stdlib.h> int m[100][100],a,b; int f[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; void dfs(int k,int s) { int i; m[k][s]=0; for(i=0;i<4;i++) if(m[k+f[i][0]][s+f[i][1]]==1) dfs(k+f[i][0],s+f[i][1]); } int main() { int n,i,j,count; scanf("%d",&n); while(n--) { count=0; scanf("%d%d",&a,&b); for(i=1;i<=a;i++) for(j=1;j<=b;j++) scanf("%d",&m[i][j]); for(i=1;i<=a;i++) for(j=1;j<=b;j++) { if(m[i][j]==1) { count++; dfs(i,j); } } printf("%d\n",count); } return 0; }
#include<stdio.h> #include<algorithm> #include<queue> using namespace std; int a,b,m[100][100]; int f[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; struct point { int x,y; }; queue<point> v; void bfs(int k,int s) { int i; point L,p,q; L.x=k;L.y=s; v.push(L); m[k][s]=0; while(!v.empty()) { p=v.front(); for(i=0;i<4;i++) { if(m[p.x+f[i][0]][p.y+f[i][1]]==1) { m[p.x+f[i][0]][p.y+f[i][1]]=0; q.x=p.x+f[i][0];q.y=p.y+f[i][1]; v.push(q); } } v.pop(); } } int main() { int n,i,j,count; scanf("%d",&n); while(n--) { count=0; scanf("%d%d",&a,&b); for(i=1;i<=a;i++) for(j=1;j<=b;j++) scanf("%d",&m[i][j]); for(i=1;i<=a;i++) for(j=1;j<=b;j++) if(m[i][j]==1) { count++; bfs(i,j); } printf("%d\n",count); } return 0; }