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;
}
该博客介绍了一种使用深度优先搜索(DFS)算法来解决计算地图上各语言最大连通区域的问题。代码示例展示了如何遍历地图,标记已访问的区域,并计算每个字母(代表不同语言)的连通块数量。最后,按照连通块数量降序及字母顺序对结果进行排序并输出。
247

被折叠的 条评论
为什么被折叠?



