d365: 10336 - Rank the Languages
https://zerojudge.tw/ShowProblem?problemid=d365
#include<iostream>
#define SWAP(x,y) {int t; t=x; x=y; y=t;}
using namespace std;
int direct[4][2] = { 0,-1,
-1, 0,
0, 1,
1, 0};
bool order(char,int,char,int);
int main()
{
char langMap[101][101]; //語言地圖
//T:測資數量,H:地圖高度,W:地圖寬度
int T,H,W;
cin>>T; //輸入測資數量
//對每組測資進行分析
for(int count=1;count<=T;count++)
{
//mark的值為1代表已經處理的區域,0代表未處理,預設都為0
bool mark[101][101]={0};
cin>>H>>W; //輸入二維地圖的長寬
for(int i=0;i<H;i++) //輸入二維地圖的內容
cin>>langMap[i];
int queuex[10000];
int queuey[10000];
int num[26] = {0};
//對地圖中的每一格進行DFS處理
for(int i=0; i<H; i++)
for(int j=0; j<W; j++)
{
if(!mark[i][j])//尚未被計算過
{
char find = langMap[i][j]; //此格地圖為哪個字元
num[find - 'a']++; //將該字元出現過的數量+1
int top=0, tail=0;
queuex[top] = i;
queuey[top] = j;
top++;
mark[i][j] = true; //被處理過
//DFS搜尋開始
while(top>tail)
{
for(int s=0; s<4; s++)//s代表4個方向
{
int fx = queuex[tail]+direct[s][0];
int fy = queuey[tail]+direct[s][1];
//探索的這格地圖
//如果 沒超出地圖範圍 且 是沒被計算過的 且 跟我們想找的符號是一樣的
if(fx>-1&&fx<H&&fy>-1&&fy<W && !mark[fx][fy]&&langMap[fx][fy]==find)
{
//就處理把這格地圖
mark[fx][fy] = true;
queuex[top] = fx;
queuey[top] = fy;
top++;
}
}
tail++;
}
}
/*
//每處理一個區塊,就印出已處理過的區域
cout<<"("<<i<<","<<j<<")"<<endl;
for(int o=0;o<H;o++)
{
for(int p=0;p<W;p++)
{
cout<<mark[o][p];
}
cout<<endl;
}
*/
}
char lan[26];
int field[26];
int c=0;
for(int i=0; i<26; i++)
if(num[i]>0)
{
lan[c] = i+'a'; //字元
field[c] = num[i]; //字元區域的數量
c++;
}
//排序答案順序,區外數越多的越前面,區塊數一樣多的時候,字母排序前面的調到前面
for(int i=0; i<c;i++)
{
for(int j=i+1; j<c; j++)
{
if(order(lan[i],field[i],lan[j],field[j]))
{
swap(lan[i],lan[j]);
swap(field[i],field[j]);
}
}
}
cout<<"World #"<<count<<endl;
for(int i=c-1; i>-1; i--)
cout<<lan[i]<<": "<<field[i]<<endl;
}
}
bool order(char ac,int a,char bc,int b)
{
if(a==b)
return bc>ac;
if(a>b)
return true;
else
return false;
}