• [UVA] 704 Colour Hash


    所谓“周界搜索”,练习搜索的好题,双向宽搜/迭代加深均可,还有很多细节有待完善,判重有比set更优的结构,宽搜还没写,先存一下。

    //Writer:GhostCai && His Yellow Duck
    
    #include<iostream>
    #include<string>
    #include<set>
    #include<queue> 
    using namespace std;
    
    set<string> book;
    set<string> ans;
    bool flag;
    string tar="034305650121078709X90";
    string st,tmp,sr;
    int n;
    
    void change(int way,string &r){
        char sav;
        int i;
        switch(way){
            case 1:
                sav=r[11];
                for(i=11;i>=1;i--) r[i]=r[i-1];
                r[0]=sav;
                break;
            case 2:
                sav=r[0];
                for(i=0;i<=10;i++) r[i]=r[i+1]; 
                r[11]=sav;
                break;
            case 3:
                sav=r[9];
                for(i=9;i<=19;i++) r[i]=r[i+1];
                r[20]=sav;
                break;
            case 4:
                sav=r[20];
                for(i=20;i>=10;i--) r[i]=r[i-1];
                r[9]=sav;
                break;
        }
    
    }
    
    void make(int dp,int mxdp){
        if(dp>mxdp) return;
        cout<<tar<<endl; 
        string pre;
        for(int i=1;i<=4;i++){
            pre=tar;
            change(i,tar);
            if(!ans.count(tar)) {
                ans.insert(tar); 
                make(dp+1,mxdp);    
            }
            tar=pre;
        }
    }
    
    void dfs(int dp,int mxdp){
        if(dp>mxdp) return;
        if(flag) return;
        if(ans.count(tmp)){
            flag=1;
            return;
        }
        if(book.count(tmp) ) return;
    //  cout<<tmp<<endl;
        int i;
        string pre;
        for(i=1;i<=4;i++){
            pre=tmp;
            change(i,tmp);
    
    //          
                dfs(dp+1,mxdp);
                book.insert(tmp); 
    
            tmp=pre;
        }
    }
    
    bool read_s(){
        int s;
        for(int i=1;i<=24;i++){
            cin>>s;
            if(i>=22) continue;
            if(s==10) st+='X' ;
            else st+=char('0'+s); 
        }
        return true;
    }
    
    int main(){
        make(1,8);
        cin>>n;
        for(int i=1;i<=n;i++){
    //      read_s();
            cin>>st;
    //      cout<<st<<endl;
            if(st==tar) {
                cout<<"PUZZLE ALREADY SOLVED
    ";
                st="";
                continue;
            }
            tmp=st;
            flag=0;
            for(int i=1;i<=8;i++){
                dfs(1,i);
                if(flag){
                    cout<<i<<endl;
                    break;
                }
            }
            if(!flag) cout<<"NO SOLUTION WAS FOUND IN 16 STEPS
    ";
            st="";
        }
    
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247531.html

  • 相关阅读:
    最短路之dijkstra算法
    拓扑排序 topsort详解
    POJ2236 Wireless Network 并查集简单应用
    最小生成树详解 prim+ kruskal代码模板
    并查集详解及模板
    POJ 3190 Stall Reservations贪心
    chapter22:源码与Tarball之(1)-传统方法编译与make方法进行编译
    vi的用法
    centos7 connect internet
    java内存区域
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247531.html
Copyright © 2020-2023  润新知