折腾了半天终于做对了。。。一开始90分一直T,后来开了加了0x就好了。。。
水个题真不容易。。。
一上午就写了两个题啊!!!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
#include<set>
using namespace std;
int n,i,step=0;
const string s2="012345678";
const int x[]={0,1,-1,3,-3};
struct wbysr
{
string s;
int step;
};
int main()
{
string s1,ss;
int xx;
for(int i=1;i<=9;i++)
{
scanf("%d",&xx);
s1+=char(xx+'0');
}
queue<wbysr> q;
q.push(wbysr{s1,0});
set<string>bo;
bo.insert(s1);
while(!q.empty())
{
wbysr now_p=q.front();
string now=now_p.s;
if(now==s2)
{
printf("%d\n",now_p.step);
return 0;
}
q.pop();
int t=0;
while(now[t]!='0')
t++;
for(int j=1;j<=4;j++)
{
string sw=now;
if(t+x[j]>8||t+x[j]<0)
continue;
if((t==2||t==5)&&x[j]==1)continue;
if((t==3||t==6)&&x[j]==-1)continue;
swap(sw[t],sw[t+x[j]]);
//if(bo.find(sw)!=bo.end())
if(bo.count(sw))
continue;
q.push(wbysr{sw,now_p.step+1});
bo.insert(sw);
if(sw==s2)
{
printf("%d\n",now_p.step+1);
return 0;
}
}
}
return 0;
}