P2730 魔板 Magic Squares (搜索)

题目链接


Solution

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

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;
}