描述:
油田问题,
连成一片的@是油田,求有几个油田1 1*3 5*@*@***@***@*@*1 8@@****@*5 5****@*@@*@*@***@@@*@@@**@0 0
思路:
课件上有,上课讲过,基础深搜,不解释。
代码:
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int m,n;
char map[110][110];
int d[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
bool v[110][110];
bool bound(int a,int b){
if(a<0||a>=m||b<0||b>=n)
return 1;
else
return 0;
}
void dfs(int x, int y)
{
for (int i = 0; i < 8; ++i)
{
if (map[x + d[i][0]][y + d[i][1]] == '*') continue;
if (bound(x + d[i][0], y + d[i][1])) continue;
if (v[x + d[i][0]][y + d[i][1]]) continue;
v[x + d[i][0]][y + d[i][1]] = 1;
dfs(x + d[i][0], y + d[i][1]);
}
}
int main(){
while (cin >> m >> n&&m != 0 && n != 0)
{
memset(v, 0, sizeof(v));
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
cin >> map[i][j];
int s = 0;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
if (map[i][j] == '@'&&!v[i][j])
{
v[i][j] = 1;
dfs(i, j);
s++;
}
}
cout << s << endl;
}
return 0;
}