Uva 10336 Rank the Languages

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 void Dfs(int x,int y);
 5 char MapString[1000][1000]={0};//要判断的“地图”
 6 bool vis[1000][1000]={0};//节点是否本访问过,
 7 int main()
 8 {
 9     int h,w;//h:height;w:width
10     int line;
11     int MaxChar;//”语言”被使用的“国家”数;
12
13     while(cin>>line){
14         for(int m=0; m < line;m++)
15         {
16             memset( vis, 0, sizeof(vis) );
17             int letter[29]={0}; //“语言”统计
18             MaxChar=0;
19             //以上应在此循环内初始化
20             cin >> h >>w;
21             //输入部分
22             for(int i = 1;i<=h;i++){
23                 for(int j = 1;j<=w;j++){
24                     cin>>MapString[i][j];
25                 }
26             }
27             for(int j = 1;j <= h;j++){
28                 for(int k = 1;k <= w;k++){
29                     if(vis[j][k] != 1){
30                         MaxChar = max(++letter[MapString[j][k]-‘a‘],MaxChar);
31                         Dfs(j,k);
32                     }
33                 }
34             }
35             cout<<"World #"<<m+1<<endl;
36             for( int j = MaxChar; j >= 1 ; j-- ){
37                 for( int k = 0 ; k < 26 ; k++ ){
38                     if( letter[k] == j ){
39                         cout<<(char)(‘a‘+ k)<<": "<<j<<endl;
40                     }
41                 }
42
43             }
44         }
45     }
46     return 0;
47 }
48 void Dfs(int x,int y)
49 {
50     vis[x][y] = 1;
51     if( (MapString[x+1][y] == MapString[x][y]) && (vis[x+1][y] !=1) )Dfs(x+1,y);
52     if( (MapString[x-1][y] == MapString[x][y]) && (vis[x-1][y] !=1) )Dfs(x-1,y);
53     if( (MapString[x][y+1] == MapString[x][y]) && (vis[x][y+1] !=1) )Dfs(x,y+1);
54     if( (MapString[x][y-1] == MapString[x][y]) && (vis[x][y-1] !=1) )Dfs(x,y-1);
55 }

算法:dfs;

思想:递归。

时间: 2024-12-15 01:48:59

Uva 10336 Rank the Languages的相关文章

[uva] 1671 History of Languages

题目描述 输入两个DFA,判断是否等价. https://uva.onlinejudge.org/external/16/1671.pdf 输入 第一行T 可以接受的字母表 第二行N 状态数 接下去N行 每个状态的情况 第一个表示是否为接受状态 后面T个是接受字母i可以转移到的状态 -1表示不转移 输出 等价输出Yes,不等价输出No 样例输入 2 3 1 -1 1 0 -1 2 0 -1 0 2 1 -1 1 0 -1 0 3 4 1 -1 -1 1 1 -1 -1 2 1 -1 -1 3 1

UVA 10887 Concatenation of Languages 字符串hash

题目链接:https://vjudge.net/problem/UVA-10887 题意: 给你两个集合A,B,任意组合成新的集合C(去重) 问你最后C集合大小 题解: 暴力 组成的新串hash起来 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i<<1 #define rs ls | 1

几道hash题

1: UVa 10887 - Concatenation of Languages map 可以做 ,但是输入实在恶心,有空串之类的HASH模板: int Hash(char *s){   int seed=131,sum=0;   while (*s)   sum=sum*seed+(*s++);   return (sum&0x7FFFFFFF)%N;} void hash_insert(int s){   int h=Hash(c[s]);   int u=head[h];   while

UVa 12412 A Typical Homework(学生信息管理系统)

A Typical Homework(a.k.a Shi Xiong Bang Bang Mang) Hi, I am an undergraduate student in institute of foreign languages. As you know, C programming is a required course in our university, even if his/her major is far from computer science. I don't lik

uva 111 History Grading(DP初步应用)

uva 111 History Grading Many problems in Computer Science involve maximizing some measure according to constraints. Consider a history exam in which students are asked to put several historical events into chronological order. Students who order all

uva 10829 - L-Gap Substrings(后缀数组)

题目链接:uva 10829 - L-Gap Substrings 题目大意:给定一个字符串,问有多少字符串满足UVU的形式,要求U非空,V的长度为g. 解题思路:对字符串的正序和逆序构建后缀数组,然后枚举U的长度l,每次以长度l分区间,在l和l+d+g所在的两个区间上确定U的最大长度. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using nam

uva 10526 - Intellectual Property(后缀数组)

题目链接:uva 10526 - Intellectual Property 题目大意:给定两个文本,问说下面一个文本中在哪些位置上抄袭了上面个一个文本的,输出n个抄袭位置(不足n个情况全部输出),按照长度优先输出,长度相同的输出位置靠前的. 注意:空格,回车都算一个字符:一段字符只能是抄袭上面的一部分,比如上:NSB*SB 下:NSB 答案:NSB. 解题思路:将两个文本连接在一起,中间用没有出现的字符分割,然后处理处后缀数组,根据height数组的性质,求出哪些位置匹配的长度不为0(注意匹配

uva 11855 - Buzzwords(后缀数组)

题目链接:uva 11855 - Buzzwords 题目大意:给定一个字符串,输出重复子串长度大于1的重复次数(每种长度只算一个次数最多的),并且按照从大到小输出. 解题思路:后缀数组,处理处后缀数组,然后枚举子串长度,按照长度分段即可. #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int max

UVA 10869 - Brownie Points II(树状数组)

UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线,然后另一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分出4个象限,第一个人得到分数为1,3象限,第二个人为二四象限,问第一个个人按最优取法,能得到最小分数的最大值,和这个值下另一个人的得分可能情况 思路:树状数组,可以枚举一点,如果能求出右上和左下点的个数就好办了,其实用一个树状数组,把y坐标离散化掉,然后记录进来,然后把点按x从左往右,每次删掉点后查询