zoukankan      html  css  js  c++  java
  • 1107. 魔板

    将棋盘编码成字符串,然后利用哈希表判重+记录距离。

    char g[2][4];
    unordered_map<string, int> dist;
    unordered_map<string, string> path;
    string st,ed;
    
    void put(string s)
    {
        for(int i = 0; i < 4; i++) g[0][i] = s[i];
        for(int i = 0; i < 4; i++) g[1][i] = s[7 - i];
    }
    
    string get()
    {
        string res;
        for(int i = 0; i < 4; i++) res += g[0][i];
        for(int i = 0; i < 4; i++) res += g[1][3 - i];
        return res;
    }
    
    string moveA(string s)
    {
        put(s);
        for(int i = 0; i < 4; i++) swap(g[0][i], g[1][i]);
        return get();
    }
    
    string moveB(string s)
    {
        put(s);
        char last[2] = {g[0][3], g[1][3]};
        for(int i = 0; i < 2; i++)
            for(int j = 2; j >= 0; j--)  // 一定要倒序循环!
                g[i][j+1] = g[i][j];
        g[0][0] = last[0], g[1][0] = last[1];
        return get();
    }
    
    string moveC(string s)
    {
        put(s);
        char temp = g[0][1];
        g[0][1] = g[1][1];
        g[1][1] = g[1][2];
        g[1][2] = g[0][2];
        g[0][2] = temp;
        return get();
    }
    
    int bfs()
    {
        queue<string> q;
        q.push(st);
        dist[st]=0;
    
        while(q.size())
        {
            string t = q.front();
            q.pop();
    
            if(t == ed) return dist[t];
    
            string s[3];
            s[0] = moveA(t), s[1] = moveB(t), s[2] = moveC(t);
            for(int i = 0; i < 3; i++)
                if(dist.count(s[i]) == 0)
                {
                    dist[s[i]] = dist[t] + 1;
                    path[s[i]] = path[t] + char('A' + i);
                    q.push(s[i]);
                }
        }
    }
    
    int main()
    {
        st = "12345678";
        for(int i = 0; i < 8; i++)
        {
            char c;
            cin >> c;
            ed += c;
        }
    
        int t = bfs();
        cout << t << endl;
        if(path[ed].size()) cout << path[ed] << endl;
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    互操作
    Rx基础
    数据流块基础
    C# 一个帮您理解回调函数的例子(新手必看)
    C# 多线程之通过Timer开启线程的例子
    C# 利用委托事件进行窗体间的传值(新手必看)
    C#XML文件操作随笔
    C# 委托学习笔记
    c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法
    c# 异步编程 使用回调函数例子
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14919204.html
Copyright © 2011-2022 走看看