@代表油田,*代表不是油田
八个方向中任意连在一起的都相当于同一块油田,不重复算
用bfs dfs都可以
自我感觉水水哒结果因为行和列ij什么的越搞越晕一直跪
所以下面代码的n,m和题目是反的
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
int po[8][2]={ {-1,1},{-1,-1},{1,-1},{1,1},{1,0},{0,1},{-1,0},{0,-1}};
char oil[110][110];
int n,m;
struct node{
int x,y;
void init(int nx,int ny)
{
x=nx;
y=ny;
}
};
void bfs(int x,int y)
{
int nx,ny;
queue<node> q;
node a,b;
a.init(x,y);
q.push(a);
oil[y][x]='*';
while(!q.empty())
{
a=q.front();
q.pop();
int xx=a.x;
int yy=a.y;
for(int i=0;i<8;i++)
{
nx=xx+po[i][0];
ny=yy+po[i][1];
if(nx<=m&&ny<=n&&nx>=0&&ny>=0&&oil[ny][nx]=='@')
{
b.init(nx,ny);
q.push(b);
oil[ny][nx]='*';
//printf("nx,ny: %d %d\n",nx,ny);
}
}
}
}
int main()
{
int time;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0){return 0;}
sum=0;
memset(oil,0,sizeof(oil));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cin>>oil[i][j];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(oil[i][j]=='@')
{
time++;
bfs(j,i);
}
}
printf("%d\n",time);
}
return 0;
}