NYOJ 27 水池數目(深搜或廣搜)
阿新 • • 發佈:2019-02-02
題目很簡單是最基礎的搜尋題
首先是深搜寫法,遞迴
程式碼如下:
[cpp] view plaincopyprint?- #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;
- }
廣搜寫法,佇列 [cpp] view plaincopyprint?#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>
- usingnamespace 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;
- }
#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;
}
這篇文章是轉載我的好友HRD的文章,剛好我複習深搜廣搜,順便轉了過來!