这是道老题了 ,做过好多遍了 在刚进入acm的时候学长们就出这种题来训练我们,那时候一脸懵逼的样子,现在回想起来现在写绝对没有以前写的时候那么困难了。但是写的时候还是会出一些小错误,前几天写的时候用的那个深搜直接写的,后来感觉写错了 这是有八个方向和状态的题目;后来过了几天又重新写了一遍这道题的核心思路就是把相连的油田都换成*然后看看有几个不相连的。记着刚开始写的时候还考虑回溯啊什么的,现在写起来很得心应手。呵呵了。
题意:@表示油田,问有几个成片的油田,也就是油田群有几个。可以上下左右斜着连一共八个方向;
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int to[8][2]{{1,0},{1,1},{1,-1},{-1,0},{-1,1},{-1,-1},{0,1},{0,-1}};//八个方向
int n, m;
char mapp[105][105];//记录符号的
void dfs(int x, int y)
{
int i, j;
int X, Y;
mapp[x][y]='*';//搜到油田就变为*,然后接着搜
for(i=0;i<8;i++)
{
X=to[i][0]+x;
Y=to[i][1]+y;
if( X>=0 && Y>=0 && X<n && Y<m && mapp[X][Y]=='@')
dfs(X,Y);
}
}
int main()
{
int i, j, sum;
while(scanf("%d%d",&n,&m),n+m)
{
getchar();
for(i=0;i<n;i++)///这里我很纠结的 在编译器上输入数据时得出的结果又误差,但是提交的时候对了,
gets(mapp[i]);
///scanf("%s",&mapp[i]);所以用这个试了试
sum=0;///记录油田群的个数的
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mapp[i][j]=='@')
{
dfs(i, j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}