题意:寻找有多少块独立的油田
思路:bfs搜索,遇到@就搜索所有与之相连的@然后将其置成*,遍历整个图看看搜索了多少次,就是答案,八方向的广搜
总结:在读图的时候使用%s一行一行的读,如果用%c还要用getchar()吃掉每一行的回车,有点麻烦并且这道题目数据有多余的空格,只能用%s
广搜代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
char map[105][105];
int dect[8][2] = {0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
void bfs(int x,int y)
{
queue<int> q;
q.push(x);
q.push(y);
while(!q.empty())
{
int xx = q.front();q.pop();
int yy = q.front();q.pop();
int i;
for(i = 0; i < 8; i++)
{
int xg = xx + dect[i][0];
int yg = yy + dect[i][1];
if(xg>= 0 && xg < n && yg >= 0 && yg < m && map[xg][yg] != '*')
{
if(map[xg][yg] == '@')
{
map[xg][yg] = '*';
q.push(xg);
q.push(yg);
}
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m) != EOF)
{
int i,j;
memset(map,'\0',sizeof(map));
if(n == 0 && m == 0)
break;
getchar();
for(i = 0; i < n; i++)
{
scanf("%s",map[i]);
}
int sum = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(map[i][j] == '@')
{
bfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
深搜代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
char map[105][105];
int dect[8][2] = {0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
void dfs(int x,int y)
{
if(x >= 0 && x < n && y >= 0 && y < m)
{
int i;
for(i = 0; i < 8; i++)
{
int gx = x+dect[i][0];
int gy = y+dect[i][1];
if(map[gx][gy] == '@')
{
map[gx][gy] = '*';
dfs(gx,gy);
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m) != EOF)
{
int i,j;
memset(map,'\0',sizeof(map));
if(n == 0 && m == 0)
break;
getchar();
for(i = 0; i < n; i++)
{
scanf("%s",map[i]);
}
int sum = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(map[i][j] == '@')
{
dfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}