题目大意:
题目的大概意思就是输入一幅地图的尺寸m X n,地图中的元素只有“*”和“@”。然后判断相邻,对角的油田有几个,“@”是油田。
解题思路:
这道题其实就是上课讲的例题。定义一个二维数组maze表示地图,然后定义一个表示方向的二维数组dir[8][2]表示延伸的方向。用深度搜索求的状态解就可以了,题目很简单。
具体代码如下:
#include <iostream>
#include <cstring>
using namespace std;
bool visit[110][110];
char maze[110][110];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
int sum,m,n,sx,sy;
bool isbound(int a,int b)
{
if(a<1 || a>m || b<1 || b>n)return true;
return false;
}
void dfs(int sx,int sy)
{
for(int i=0;i<8;i++)
{
if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue; if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;
if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;
visit[sx+dir[i][0]][sy+dir[i][1]]=1; dfs(sx+dir[i][0],sy+dir[i][1]);
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0)break;
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>maze[i][j];
}
}
sum=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(maze[i][j]=='@'&&!visit[i][j])
{visit[i][j]=1;dfs(i,j);sum++;}
}
}
cout<<sum<<endl;
}
return 0;
}