题目连接: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;
}