zoukankan      html  css  js  c++  java
  • 【洛谷】P2730 魔板 Magic Squares

    这道题显然是个宽搜(类似于8数码问题)。

    只要每次按A、B、C三种方式进行宽度优先搜索,所以找到的第一次找到的解必定是步数最少的解。

    另外,注意判重,(向用康托展开的dalao们膜拜),相比于康托展开(我这种菜蒟蒻听都没听过),我直接用c++的map<string,bool>来判重。

    既不超空间,操作也很短~~(前提是,这里有大量字符串操作)

    OK~下面附上AK代码:

    #include<bits/stdc++.h>
    using namespace std;
    int front,rear,dep[5000005];
    string how[5000005],zt[5000005],purpose;
    map <string,bool> mp;
    int main()
    {
        char ch;
        for (int i = 1 ; i <= 4 ; i ++) cin>>ch , purpose += ch;
        string tmp = "";
        for (int i = 1 ; i <= 4 ; i ++) cin>>ch , tmp = ch + tmp;
        purpose += tmp;
        zt[1] = "12348765"; dep[1] = 0; how[1] = ""; mp[zt[1]] = 1;
        front = 1 ; rear = 1;
        while (front <= rear)
        {                
            if (zt[front] == purpose)
            {
                cout<<dep[front]<<endl;
                int cnt = 0;
                for (int i = 0 ; i < how[front].length() ; i ++)
                {
                    cnt ++;
                    if (cnt == 60) cout<<how[front][i]<<endl , cnt = 0; else cout<<how[front][i];
                }
                return 0;
            }
            //1:
            string st = zt[front].substr(4,8) + zt[front].substr(0,4);
            if (!mp[st])
            {
                mp[st] = 1;
                rear ++;
                zt[rear] = st;
                dep[rear] = dep[front] + 1;
                how[rear] = how[front] + 'A';
            }    
            //2:
            st = zt[front][3]; 
            st = st + zt[front].substr(0,3);
            st = st + zt[front][7] + zt[front][4] + zt[front][5] + zt[front][6];
            if (!mp[st])
            {
                mp[st] = 1;
                rear ++;
                zt[rear] = st;
                dep[rear] = dep[front] + 1;
                how[rear] = how[front] + 'B';
            }
            //3:
            st = zt[front];
            st[1] = zt[front][5];
            st[2] = zt[front][1];
            st[6] = zt[front][2];
            st[5] = zt[front][6];
            if (!mp[st])
            {
                mp[st] = 1;
                rear ++;
                zt[rear] = st;
                dep[rear] = dep[front] + 1;
                how[rear] = how[front] + 'C';
            }
            front ++;
        } 
        return 0;
    }
    

      

  • 相关阅读:
    [pyqt] 基于特征匹配的动漫头像检索系统(一)
    [python] 简单遗传算法与粒子群算法
    [美化] 博客园美化历程
    [同人] 我的莱昂
    数据结构 结语
    灌水机
    Ubuntu 中linux 编译错误的(-)
    目标抓取全站妹子封面图片全部爬下来以图片标题命名
    Makefile 介绍
    Linux 中的 ~/. 表示的意思
  • 原文地址:https://www.cnblogs.com/YMY666/p/7953544.html
Copyright © 2011-2022 走看看