原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1241
题目大意:
输入m和n,表示有m行n列。然后输入m*n的图。‘*‘表示没有油。’@‘表示有油。问一共有多少片油田。(一个油点可以和周围8个方向的油点连成一个油田)
思路:
遍历搜索每一个点。和此点属于同一油井的点改成“*”
每次搜索到不能在搜索的时候,把次数+1.然后搜索下一个点
根据题意。搜索方式为8个方向
(这道题也可以用BFS写)
代码如下:
#include <iostream>
#include <cstdio>
char oil[105][105];
using namespace std;
void find( int i,int j ,int m,int n)
{
int Xz[8]={-1,-1,-1,0,1,1,1,0};
int Yz[8]={-1,0,1,1,1,0,-1,-1};
int k;
int new_x,new_y;
for( k = 0; k < 8; k++ )
{
new_x = i + Xz[k];
new_y = j + Yz[k];
//越界判定
if( new_x < 0 || new_x >= m || new_y < 0 || new_y >= n)
continue;
if( oil[new_x][new_y] != '*')
{
oil[new_x][new_y] = '*';
find(new_x,new_y,m,n);
}
}
}
int main()
{
while(1)
{
int m,n,max;
cin>>m>>n;
max = 0;
if( m == 0 && n == 0)
break;
int i,j;
for( i = 0; i < m; i++ )
for( j =0 ;j < n; j++)
cin>>oil[i][j];
for( i = 0; i < m; i++ )
for( j =0 ;j < n; j++)
if( oil[i][j] == '@')
{
find(i,j,m,n);
max++;
}
cout<<max<<endl;
}
return 0;
}