您的位置:首页 > 其它

UVA 572 Oil Deposits

2016-07-20 19:37 375 查看

UVA-572

题意:求有多少个联通的油块(@表示油块)。

解题思路:遇到一个@就开始遍历联通的油块,走过的油块改为*,统计进入多少次就好了。

/*************************************************************************
> File Name: UVA-572.cpp
> Author: Narsh
>
> Created Time: 2016年07月20日 星期三 09时53分37秒
************************************************************************/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int c[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
char map[110][110];
bool check[110][110];
int n,m;
void dfs(int x,int y) {
if (!check[x][y]) return ;
check[x][y]=false;
for (int i = 0; i < 8; i++)
if (map[x+c[i][0]][y+c[i][1]] == '@')
dfs(x+c[i][0],y+c[i][1]);
}
int main() {
while(scanf("%d%d\n",&n,&m) && n+m) {
for (int i = 1; i <= n; i++)
for  (int j = 1; j <= m+1; j++)
scanf("%c",&map[i][j]);
for (int i = 1; i <= n; i++) map[i][0]=map[i][m+1]=' ';
for (int i = 1; i <= m; i++) map[0][i]=map[n+1][i]=' ';
memset(check,true,sizeof(check));
int ans=0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (map[i][j] == '@' && check[i][j]) {
ans++;
dfs(i,j);
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: