题目 Property Distribution Aizu - 0118

题目连接:https://vjudge.net/problem/Aizu-0118
这道题是一道日文题,反正看不懂,不过谷歌自带翻译是个好东西
题目大意:一个H * W的矩形,其中‘#’是一类,‘*’是一类,‘@’是一类,然后求总共有几个区域,每一个区域只有一个种类,输入0 0是结束
做法:染色 + dfs
Sample Input

10 10
####*****@
@#@@@@#*#*
@##***@@@*
#****#*@**
##@*#@@*##
*@@@@*@@@#
***#@*@##*
*@@@*@@##@
*@*#*@##**
@****#@@#@
0 0

Output for the Sample Input

33

代码:

#include<iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 105;
const int inf = 77777777;
int h, w;
char ch[maxn][maxn];
int vis[maxn][maxn];
int ans;
int s1[] = {1, -1, 0, 0};
int s2[] = {0, 0, 1, -1};
void init(){
	for(int i = 0; i < maxn; ++i)
		for(int j = 0; j < maxn; ++j){
			ch[i][j] = '$';//初始化,防止前一次的字符影响这一次的结果
			vis[i][j] = 0;
		}
	ans = 0;
}
//在上下左后找相同的,然后划分为一个区域
void dfs(int x, int y, char tu){
     if(vis[x][y])
     	return ;
     vis[x][y] = ans;
     for(int i = 0; i < 4; ++i){
     	int xx = x + s1[i];
     	int yy = y + s2[i];
     	if(!vis[xx][yy] && ch[xx][yy] == tu)
     		dfs(xx, yy, ch[xx][yy]);
     }
}
int main(){
	while(~scanf("%d%d", &h, &w) && h && w){
		init();
		for(int i = 0; i < h; ++i){
			cin >> ch[i];
		}
		for(int i = 0; i < h; ++i){
			for(int j = 0; j < w; ++j){
				if(!vis[i][j] && ch[i][j] != '$'){
					ans++
					dfs(i, j, ch[i][j]);
				}
			}
		}
		cout << ans << '\n';
	}
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值