对于油田合并的两种不同的搜索法。
深搜代码:
#include<stdio.h>
#include<string.h>
char map[101][101];
int vis[101][101];
int dfs(int x,int y);
int n;
int main()
{
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++) scanf("%s",map[i]);
int many=0;
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++) if(!vis[i][j] && map[i][j]=='@') many+=dfs(0,0);
}
printf("%dn",many);
return 0;
}
int dfs(int x,int y)
{
vis[x][y]=1;
if(x-1>=0 && !vis[x-1][y] && map[x-1][y]=='@') {vis[x-1][y]=1;dfs(x-1,y);}
if(x+1<n && !vis[x+1][y] && map[x+1][y]=='@') {vis[x+1][y]=1;dfs(x+1,y);}
if(y-1>=0 && !vis[x][y-1] && map[x][y-1]=='@') {vis[x][y-1]=1;dfs(x,y-1);}
if(y+1<n && !vis[x][y+1] && map[x][y+1] =='@') {vis[x][y+1]=1; dfs(x,y+1);}
return 1;
}
广搜代码:
#include <cstdio>
#include <queue>
using namespace std;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
char map[60][60];
int n, m;
typedef struct node
{
int x, y;
};
void bfs(int x, int y)
{
queue<node> q;
q.push(node{x,y});
while(!q.empty())
{
node now = q.front(); q.pop();
map[now.x][now.y] = '*';
for(int k=0; k<4;k++)
{
int xx = now.x+dx[k];
int yy = now.y+dy[k];
if(xx<0||xx>=n||yy<0||yy>=m||map[xx][yy]=='*') continue;
now.x = xx; now.y = yy;
q.push(now);
}
}
}
int main()
{
int i, j;
while(~scanf("%d%d",&n,&m))
{
for(i=0; i<n; i++) scanf("%s",map[i]);
int ans = 0;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
if(map[i][j]=='@')
{
bfs(i,j);
ans++;
}
printf("%dn",ans);
}
return 0;
}
不同的思路可以达到相同的效果,可以说是殊途同归。