UVA-10336

UVA-10336

题目介绍:
You might have noticed that English and Spanish are spoken in many areas all over the world. Now it
would be nice to rank all languages according to the number of states where they are spoken.
You’re given a map which shows the states and the languages where they are spoken. Look at the
following map:
ttuuttdd
ttuuttdd
uuttuudd
uuttuudd
The map is read like this: Every letter stands for a language and states are defined as connected
areas with the same letter. Two letters are “connected” if one is at left, at right, above or below the
other one. So in the above map, there are three states where the language “t” is spoken, three where
“u” is spoken and one state where people speak “d”.
Your job is to determine the number of states for each language and print the results in a certain
order.

大意:
计算各个字母有多少个最大连通块,直接dfs即可。输出时需要按连通块数量从大到小排,数量相同时字母序小的在前。

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int r,c;
const int Maxn=10005;
char ss[Maxn][Maxn];
int vis[Maxn][Maxn];
const int Move[][2]={{-1,0},{1,0},{0,-1},{0,1}};

struct node{
	int alpha;
	int num;
	
	bool operator <(const node& A)const{
		return num>A.num||(num==A.num&&alpha<A.alpha);
	}
};

node now[30];

void dfs(int x,int y,char c){
	vis[x][y]=1;
	for(int i=0;i<4;i++){
		int temp_x=x+Move[i][0];
		int temp_y=y+Move[i][1];
		if(temp_x<0||temp_x>=r||temp_y<0||temp_y>=c)
			continue;
		if(!vis[temp_x][temp_y]&&ss[temp_x][temp_y]==c)
			dfs(temp_x,temp_y,c);
	}
}

int main(){
	int t,Case=1;
	cin>>t;
	while(t--){
		scanf("%d%d",&r,&c);
		for(int i=0;i<r;i++){
			string temp;
			cin>>temp;
			for(int j=0;j<c;j++)
				ss[i][j]=temp[j];
		}
		memset(vis,0,sizeof(vis));
		for(int i=0;i<30;i++){
			now[i].num=0;
			now[i].alpha=i;
		}
		for(int i=0;i<r;i++){
			for(int j=0;j<c;j++){
				if(!vis[i][j]){
					dfs(i,j,ss[i][j]);
					now[ss[i][j]-'a'].num++;
				}
			}
		}
		sort(now,now+30);
		printf("World #%d\n",Case++);
		for(int i=0;i<30;i++){
			if(now[i].num==0)break;
			printf("%c: %d\n",now[i].alpha+'a',now[i].num);
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值