zoukankan      html  css  js  c++  java
  • USACO shuttle

      这道题用广搜即可,只需要加两个优化就行。。 代码如下:

      

    /*
        ID: m1500293
        LANG: C++
        PROG: shuttle
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <string>
    #include <set>
    #include <iostream>
    
    using namespace std;
    
    struct State
    {
        string now, ans;
        State(string now="", string ans=""):now(now), ans(ans) {}
    };
    
    bool judge(int n, State st)
    {
        for(int i=0; i<n; i++)
            if(st.now[i]!='b') return false;
        if(st.now[n]!=' ') return false;
        for(int i=n+1; i<=n+1+n-1; i++)
            if(st.now[i]!='w') return false;
        return true;
    }
    
    set<string> vis;
    string bfs(int n)
    {
        queue<State> que;
        string now = "";
        for(int i=0; i<n; i++) now+='w';
        now+=' ';
        for(int i=0; i<n; i++) now+='b';
        que.push(State(now, ""));
        //cout<<now<<endl;
        vis.insert(now);
        while(!que.empty())
        {
            State tp = que.front(); que.pop();
            if(judge(n, tp)) return tp.ans;
            int idx = 0;
            for(int i=0; i<tp.now.length(); i++) if(tp.now[i]==' ')
            {
                idx = i;
                break;
            }
            int len = tp.now.length();
            string str = tp.now;
            if(idx-2>=0 && str[idx-2]!=str[idx-1] && str[idx-2]=='w')
            {
                swap(str[idx-2], str[idx]);
                if(vis.find(str) == vis.end())
                {
                    char c = '0'+idx-2;
                    que.push(State(str, tp.ans+c));
                    vis.insert(str);
                }
                swap(str[idx-2], str[idx]);
            }
            if(idx-1>=0 && str[idx-1]=='w')
            {
                swap(str[idx-1], str[idx]);
                if(vis.find(str) == vis.end())
                {
                    char c = '0'+idx-1;
                    que.push(State(str, tp.ans+c));
                    vis.insert(str);
                }
                swap(str[idx-1], str[idx]);
            }
            if(idx+1 < len && str[idx+1]=='b')
            {
                swap(str[idx+1], str[idx]);
                if(vis.find(str) == vis.end())
                {
                    char c = '0'+idx+1;
                    que.push(State(str, tp.ans+c));
                    vis.insert(str);
                }
                swap(str[idx+1], str[idx]);
            }
            if(idx+2<len && str[idx+2]!=str[idx+1] && str[idx+2]=='b')
            {
                swap(str[idx], str[idx+2]);
                if(vis.find(str) == vis.end())
                {
                    char c = '0' + idx+2;
                    que.push(State(str, tp.ans+c));
                    vis.insert(str);
                }
                swap(str[idx], str[idx+2]);
            }
        }
        return "";
    }
    
    int main()
    {
        freopen("shuttle.in", "r", stdin);
        freopen("shuttle.out", "w", stdout);
        int n;
        scanf("%d", &n);
        string s = bfs(n);
        int num = 0;
        for(int i=0; i<s.length(); i++)
        {
            //printf("%c%c", s[i]+1, i==s.length()-1?'
    ':' ');
            printf("%d", s[i]-'0'+1);
            num++;
            if(num==20)
            {
                printf("
    ");
                num = 0;
            }
            else if(i != s.length()-1)
                printf(" ");
        }
        if(s.length()%20!=0) printf("
    ");
        return 0;
    }
  • 相关阅读:
    Java分布式锁
    深度神经网络学习过程中的梯度消失问题
    深度神经网络学习过程中的梯度消失问题
    .net下 本地锁、redis分布式锁、zk分布式锁的实现
    .net下 本地锁、redis分布式锁、zk分布式锁的实现
    CLR共享程序集和强命名程序集
    CLR共享程序集和强命名程序集
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 接线过程
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 接线过程
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 安装过程
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5167623.html
Copyright © 2011-2022 走看看