Aizu 0118 Property Distribution
题意
一块矩形的区域,里面有三种字符,把相邻的相同字符连接成整体,问可以分成多少块。
输入:多个样例,每个样例输入高 h,宽 w,h 和 w 为 0 时输入结束。(0 < h, w <= 100)
输出:每个样例输出一个整数。
这道题的思路和那道LakeCounting基本相同,只不过这道题多会重复几次终点换起点的操作。
#include<iostream>
#include<cstring>
using namespace std;
char orc[101][101];
int h, w, sum;
int dirx[4] = {0, 1, 0, -1}, diry[4] = {1, 0, -1, 0};
void dfs(int x, int y, char sta)//这里多加了一个状态值,就是当前要找字符
{
orc[x][y] = '.'; //标记已经到达过的点
//cout << x << " " << y << " " << sta << endl;
int xx, yy;
for(int i = 0; i < 4; i++){
xx = x + dirx[i];yy = y + diry[i];
if(xx >= 0 && xx < h && yy >= 0 && yy < w && orc[xx][yy] == sta){
//上下左右搜索有无相同字符
dfs(xx, yy, sta);
}
}
}
int main(){
while(true){
cin >> h >> w;
if(h == 0 && w == 0)return 0;
memset(orc, 0, sizeof(orc));
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++)
cin >> orc[i][j];
sum = 0;
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++)
if(orc[i][j] != '.'){ //挨个遍历,找到没被标记过的就搜索一下
dfs(i, j, orc[i][j]);
sum++;
}
cout << sum << endl;
}
return 0;
}