标签:
样例输入:
1 1
* 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
样例输出:
0 1 2 2
题意:@代表石油,@的八个方位如果存在@,则@看成共属于一个油块,求油块的个数。
思路:典型的深搜,编写一个深搜算法ok
代码:
#include <iostream>
#include<string.h>
using namespace std;
//定义点的八个方向
int dir[8][2] = {{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
bool vis[105][105];
char map[105][105];
int m = 0,n = 0;
bool isok(int x,int y){
//注意这边是x >= 0,y >= 0不要写成x > 0,y > 0
if(x >= 0 && x < m && y >= 0 && y < n && map[x][y]==‘@‘){
return true;
}
else{
return false;
}
}
void dfs(int x ,int y){
int dx,dy;
for(int i = 0;i < 8;i++){
dx = dir[i][0] + x;
dy = dir[i][1] + y;
if(isok(dx,dy) && !vis[dx][dy]){
vis[dx][dy] = true;
dfs(dx,dy);
}
}
}
int main()
{
int i = 0,j = 0;
while(cin >> m >> n){
if(m == 0 && n == 0){
break;
}
for(i = 0;i < m;i ++)
for(j = 0;j < n;j ++){
cin >> map[i][j];
}
int cnt = 0;
memset(vis,0,sizeof(vis));
for(i = 0;i < m;i ++)
for(j = 0;j < n;j ++){
if(map[i][j] == ‘@‘ && !vis[i][j]){
cnt ++ ;
dfs(i,j);
}
}
cout << cnt << endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/2016zhanggang/p/5406069.html