UVA, 10336 Rank the Languages

时间:2023-03-09 08:50:03
UVA, 10336 Rank the Languages
难点在于:递归函数和输出;

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
class Rank{
private:
    int length,width,ans=0;
    char c;
    vector <char> v;
    int a[26][1000];
    map <char,int> m;  //output
    char field[1000][1000];
public:
    void Readcase(){
        cin>>width>>length;
        for(int i=0;i<width;i++){
            for(int j=0;j<length;j++){
                cin>>field[i][j];
            }
        }
    }
    void Computing(){
        for(int i=0;i<width;i++)
            for(int j=0;j<length;j++){
                vector<char>::iterator it=find(v.begin(),v.end(),field[i][j]);
                if(it!=v.end()) continue;   //找到了
                else v.push_back(field[i][j]);
            }
        for(int i=0;i<v.size()-1;i++)
            if(v[i]>v[i+1]) swap(v[i],v[i+1]);
        for(int k=0;k<v.size();k++){
            c=v[k];
            for(int i=0;i<width;i++){
                for(int j=0;j<length;j++){
                    if(field[i][j]==c){
                        dfs(i,j);
                        ans++;
                    }
                }
            }
            m.insert(map<char,int>::value_type(c,ans));
            ans=0;
        }
    }
    void Output(){
        int l=m.size(),max;
        map<char,int>::iterator it3;
        while(l--){
            max=m.begin()->second;
            for(map<char,int>::iterator it2=m.begin();it2!=m.end();it2++){
                if(it2->second>max) max=it2->second;
            }
            for(it3=m.begin();it3!=m.end();it3++){
                if(max==it3->second) break;
            }
            cout<<it3->first<<": "<<it3->second<<endl;
            m.erase(it3);
        }
    }
    void dfs(int x,int y){
        field[x][y]='*';  //标记这个地方已经找过了
        if(0<=x&&x<width&&0<=y&&(y-1)<length&&field[x][y-1]==c){
            dfs(x,y-1);
        }
        if(0<=x&&x<width&&0<=y&&(y+1)<length&&field[x][y+1]==c){
            dfs(x,y+1);
        }
        if(0<=(x+1)&&(x+1)<width&&0<=y&&y<length&&field[x+1][y]==c){
            dfs(x+1,y);
        }
        if(0<=(x-1)&&(x-1)<width&&0<=y&&y<length&&field[x-1][y]==c){
            dfs(x-1,y);
        }
    }
};
int main()
{
    int cases;
    cin>>cases;
    for(int i=1;i<=cases;i++){
        Rank r;
        r.Readcase();
        r.Computing();
        cout<<"World #"<<i<<endl;
        r.Output();
    }
    return 0;
}