P2578
[ZJOI2005]九数码游戏
题目描述

输入格式
输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字。初始状态不会是目标状态。
输出格式
如果目标状态无法达到,则输出“UNSOLVABLE”(引号不输出)。
否则,第一行是一个整数S,表示最少的操作次数。接下来4 × (S + 1)行,每四行表示一个状态:前三行每行三个整数,相邻两数用空格隔开,表示每个方格上的数字,第四行是一个空行,作为分隔。第一个状态必须是初始状态,最后一个状态必须是目标状态。
样例 #1
样例输入 #1
2 3 0
1 8 7
5 4 6
样例输出 #1
4
2 3 0
1 8 7
5 4 6
1 2 3
5 8 0
4 6 7
1 2 3
0 5 8
4 6 7
0 1 2
4 5 3
6 7 8
0 1 2
3 4 5
6 7 8
一言难尽
这个题若按正常BFS手写q的话空间要炸
所以说只能queue<> ……
然后还要开O2才能卡过 只能说人都调麻了
警示!
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string start,target;
const int mod=100007;
struct did{
int c;
string s="";
string now;
}z;
queue<did>q;
map<string,int>pd;
void bfs()
{
pd[start]=1;
while(!q.empty())
{
string a,b;
did s=q.front();q.pop();
a=s.now;
if(a==target)
{
cout<<s.c<<"\n";
for(int i=1;i<=s.s.size()/9;i++)
{
string ss=s.s;
cout<<ss[0+(i-1)*9]<<" "<<ss[1+(i-1)*9]<<" "<<ss[2+(i-1)*9]<<"\n";
cout<<ss[3+(i-1)*9]<<" "<<ss[4+(i-1)*9]<<" "<<ss[5+(i-1)*9]<<"\n";
cout<<ss[6+(i-1)*9]<<" "<<ss[7+(i-1)*9]<<" "<<ss[8+(i-1)*9]<<"\n";
cout<<"\n";
}
exit(0);
}
b=a;int pos;
b=a;
b[0]=a[3],b[1]=a[0],b[2]=a[1];
b[3]=a[6],b[4]=a[4],b[5]=a[2];
b[6]=a[7],b[7]=a[8],b[8]=a[5];
if(!pd[b])
{
z.c=s.c+1,z.s=s.s+b,z.now=b;
q.push(z);
pd[b]=1;
}
b=a;
b[3]=a[5],b[4]=a[3],b[5]=a[4];
if(!pd[b])
{
z.c=s.c+1,z.s=s.s+b,z.now=b;
q.push(z);
pd[b]=1;
}
}
}
int main()
{
ios::sync_with_stdio(false);
for(int i=1;i<=9;i++)
{
int x;
cin>>x;
start+=char(int('0')+x);
}
z.c=0,z.now=start,z.s=start;
q.push(z);
target="012345678";
bfs();
cout<<"UNSOLVABLE\n";
return 0;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号