Zerojudge d365

首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信zhuastor@gmail.com

解題心得

直覺就是DFS,所以我就來解了
DFS真的讓人又愛又恨…<3
喔對了我學到”map以value排序的技巧”
然後又複習了map跟vector的clear()(每次都忘)
當然這題也不一定需要用到map

解題想法

DFS,沒啥好說的,因為我不會BFS…
這題麻煩的點有以下兩點:
1.紀錄後output部分是以區域數大小排序,相同則英文字母順序
2.單組有好多筆所以要清空前面的東西
先來說說我一開始的擔憂
我直覺使用map,但這就必須使用到”map以value排序”
map預設是使用key排序的,所以我就去爬文了.w.
後來找到用vector搭配pair並作自定義sort(不難喔)
接下來我又有個擔憂了,因為我本身不會算時間複雜度..
所以我就在想每一次都需要清空map跟vector,這樣會不會超時
結果意外不會,作者好人一生平安…
補充一下,我DFS的方法很笨,就是對字元二維陣列遍歷,搭配布林陣列
每找到一個在布林陣列中是false(代表沒走過)的,我就dfs,再設為true

AC code

#include<bits/stdc++.h>
using namespace std;
int n,m,g,mean;
char c[10005][10005];
bool ta[10005][10005];
map<char,int>mp;
vector<pair<char,int>>vmp;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void dfs(int nowx,int nowy,char now){
    int gx,gy;
    for(int x=0;x<4;x++){
        gx=nowx+dx[x];
        gy=nowy+dy[x];
        if(!ta[gx][gy] && (gx>=1 && gx<=n) && (gy>=1 && gy<=m) && c[gx][gy]==now){
            ta[gx][gy]=true;
            dfs(gx,gy,now);
        }
    }
}
bool cmp(const pair<char,int>&v1,const pair<char,int>&v2){
    if(v1.second==v2.second){
        return (v1.first)<(v2.first);
    }
    return v1.second>v2.second;
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> g;
    mean=g;
    while(g--){
        cin >> n >> m;
        for(int x=1;x<=n;x++){
            for(int y=1;y<=m;y++){
                cin >> c[x][y];
                ta[x][y]=false;
            }
        }
        for(int x=1;x<=n;x++){
            for(int y=1;y<=m;y++){
                if(!ta[x][y]){
                    ta[x][y]=true;
                    mp[c[x][y]]++;
                    dfs(x,y,c[x][y]);
                }
            }
        }
        cout << "World #"<< mean-g << endl;
        for(auto it=mp.begin();it!=mp.end();it++){
            vmp.push_back(make_pair(it->first,it->second));
        }
        sort(vmp.begin(),vmp.end(),cmp);
        for(auto it=vmp.begin();it!=vmp.end();it++){
            cout << it->first << ": " << it->second << endl;
        }
        mp.clear();
        vmp.clear();
    }
    
    return 0;
}

題目連結 : UVa10336 - Rank the Languages