题目大意:计算油田数目
@代表油田,*代表非油田
油是可以横向竖向斜向流通,互相流通的油田算一个油田。
代码如下:
<span style="font-family:Microsoft YaHei;">#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
int dir[][2]={0,1,1,0,0,-1,-1,0,1,1,1,-1,-1,-1,-1,1},s;
char map[101][101];
struct Node
{
int i,j;
int flag;
};
void DFS(int m,int n)
{
Node cur,next;
stack<Node> q;
cur.i=m;
cur.j=n;
cur.flag=0;
q.push(cur);
while(!q.empty())
{
if(q.top().flag==1)//搜过就抛出
{
q.pop();
continue;
}
cur.i=q.top().i;
cur.j=q.top().j;
map[cur.i][cur.j]='*';
q.top().flag=1;
for(int i=0;i<8;i++)//8个方向搜索
{
next.i=cur.i+dir[i][0];
next.j=cur.j+dir[i][1];
next.flag=0;
if(map[next.i][next.j]=='@')
q.push(next);
}
}
s++;
}
int main()
{
int m,n,i,j;
while(cin>>m>>n)
{
if(m==0)
break;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>map[i][j];
s=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(map[i][j]=='@')
DFS(i,j);
}
cout<<s<<endl;
}
return 0;
}</span>