XDOJ1327

XDOJ1327

题目描述

第七兽分为四个亚种,我们把它们记为 A, B, C, D。每只兽需要至少一个格子作为自己的领地。如果两只相邻的兽是一个亚种的,它们会融合成一只兽,这只兽将会占据以前两只兽的领地。 
珂朵莉想问威廉,在一个 n * m 的 铺满第七兽的四个亚种 的矩形里面,到底有多少只第七兽的四个亚种。

输入

第一行包括两个数 n, m, 表示这个矩形的大小。 
剩下行描述了这个矩形内兽的分布情况。

输出

输出一行四个数,表示第七兽 亚种 A, B, C, D 的个数,每两个数之间有一个空格。

样例输入

4 7
DDDDDDD
DABABAD
DBACACD
DDDDDDD

样例输出

5 3 2 1

示例代码

#include <iostream>
#include <cstring>
#define N 55
using namespace std;
char data[N][N];
void dfs(int x,int y,char s)
{
	if(data[x][y]==s)
	{
		data[x][y] = 'E';
		dfs(x+1,y,s);
		dfs(x-1,y,s);
		dfs(x,y+1,s);
		dfs(x,y-1,s);
	}
}
int main()
{
	int m,n;
    cin >> m >> n;
    int resu = 0;
    memset(data,0,sizeof(data));
    for(int i = 1 ; i <= m ;i++)
    	for(int j = 1 ; j <=n ;j++)		cin >>data[i][j];
    for(int i = 1 ; i <= m ;i++)
    	for(int j = 1 ; j <=n ;j++)		if(data[i][j]=='A') dfs(i,j,'A'),resu++;
		cout << resu << " ";
	resu  = 0;
	for(int i = 1 ; i <= m ;i++)
    	for(int j = 1 ; j <=n ;j++)		if(data[i][j]=='B') dfs(i,j,'B'),resu++;
		cout << resu << " ";
	resu  = 0;
	for(int i = 1 ; i <= m ;i++)
    	for(int j = 1 ; j <=n ;j++)		if(data[i][j]=='C') dfs(i,j,'C'),resu++;
		cout << resu << " ";
	resu  = 0;
	for(int i = 1 ; i <= m ;i++)
    	for(int j = 1 ; j <=n ;j++)		if(data[i][j]=='D') dfs(i,j,'D'),resu++;
		cout << resu ;	
	return 0;
}

总结

笔者的代码通常长度上比较短,而且没有无用头文件,总体来说,这道题是一道比较常见的dfs,这道题据说用队列写也很简单,笔者有空尝试一下,稍后代码附上。

PS:这倒是暑训签到题,题号为B,笔者会尽力在8.1前完成其他题解。

透过泪水看到希望
原文地址:https://www.cnblogs.com/ronnielee/p/9495161.html