topcoder SRM 618 DIV2 MovingRooksDiv2

OpenSoucre發表於2014-06-16

一開始Y1,Y2兩個引數看不懂,再看一遍題目後才知道,vector<int>索引代表是行數,值代表的是列

此題資料量不大,直接深度搜尋即可

注意這裡深度搜尋的訪問標識不是以前的索引和元素,而是一個交換元素後的整個狀態vector<int>,這樣可以避免重複元素的搜尋

    set<vector<int> > visit;
    bool flag;
    void dfs(vector<int>& src, vector<int>& dst){
        if(src == dst ) flag =true;
        if(flag) return;
        if(visit.find(src)!=visit.end()) return;
        visit.insert(src);
        for(int i = 0 ; i < src.size(); ++ i){
            for(int j = i+1; j <  src.size(); ++ j){
                if(src[i] > src[j]){
                    swap(src[i],src[j]);
                    dfs(src,dst);
                    swap(src[i],src[j]);
                }
            }
        }
    }

    string move(vector <int> Y1, vector <int> Y2) {
        visit.clear();
        flag = false;
        dfs(Y1, Y2);
        if(flag) return "Possible";
        else return "Impossible";
    }

 

相關文章