P2730 魔板 Magic Squares (搜索)

题目链接


Solution

这道题,我是用 \(map\) 做的.
具体实现,我们用一个 \(string\) 类型表示任意一种情况.
可以知道,排列最多只有 \(8!\) 个.
然后就是直接的广搜了.直接用初始串去操作即可.
关于字典序,我们直接先启用 \(A\) 操作即可.

Code

/*
Problem: 2730
Time: Day -95
*/
#include<bits/stdc++.h>
using namespace std;
map <string,string> kkk;
map <string,int> v;
map <string,int> vis;
queue<string>q;
string ans;

void output(string s)
{
    string fuck=kkk[s];
    int len=fuck.length();
    cout<<len<<endl;
    for(int i=0;i<len;i++)
    cout<<fuck[i];
}

void bfs()
{
    string s="12345678";
    q.push(s);
    kkk[s];
    vis[s]=1;
    while(q.empty()!=1)
    {
        string now=q.front();
        q.pop();
        if(now==ans){output(now);exit(0);}
        for(int i=1;i<=3;i++)
        {
            string tt=now;
            if(i==1)
            {   
                for(int j=0;j<4;j++)
                swap(tt[j],tt[8-j-1]);
                if(!vis[tt])
                {
                    kkk[tt]=kkk[now]+'A',v[tt]=1;
                    q.push(tt),vis[tt]=1;
                }
            }
            if(i==2)
            {
                tt[0]=now[3]; tt[7]=now[4];
                tt[1]=now[0]; tt[2]=now[1]; tt[3]=now[2];
                tt[4]=now[5]; tt[5]=now[6]; tt[6]=now[7];
                if(!vis[tt])
                {
                    kkk[tt]=kkk[now]+'B',v[tt]=1;
                    q.push(tt),vis[tt]=1;
                }
            }
            if(i==3)
            {
                tt[1]=now[6]; tt[2]=now[1];
                tt[5]=now[2]; tt[6]=now[5];
                if(!vis[tt])
                {
                    kkk[tt]=kkk[now]+'C',v[tt]=1;
                    q.push(tt),vis[tt]=1;
                }
            }
        }
    }
}

int main()
{
    int a[10];
    for(int i=0;i<8;i++)
    cin>>a[i],ans+=('0'+a[i]);
    bfs();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Kv-Stalin/p/9436920.html