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;
}

results matching ""

    No results matching ""