bfs进行解决。
刚开始想用map进行判重,结果重载运算符那块卡了半天,又学了康托展开进行判重,
bfs好长时间没写了,卡了半天,在for循环中下一步竟然受到上一部影响,太失误了。。。。。。
ac代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXN 0x3f3f3f3f3f3f3f3f
#define PI acos(-1.0)
#define E exp(1.0)
using namespace std;
//#define debug
struct Puzzle{
int e[10];
int space;
int ans;
};
Puzzle tmp;
bool state[362880];
int kangtuo(int x[]) //康拓展开进行判重
{
int fac[]={1,1,2,6,24,120,720,5040,40320};
int i,j,t,sum;
sum = 0;
for(i=0;i<9;i++)
{
t = 0;
for(j=i+1;j<9;j++)
{
if(x[j]<x[i])
t++;
}
sum = sum+t*fac[8-i];
}
if(state[sum]==1)
return 0;
else
{
state[sum] = 1;
return 1;
}
}
bool judge(Puzzle t){
for(int i=0;i<=8;i++){
if(t.e[i]!=i+1) return false;
}
return true;
}
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int bfs(){
queue<Puzzle> q;
q.push(tmp);
while(!q.empty()){
Puzzle t=q.front();
q.pop();
kangtuo(t.e);
if(judge(t)) return t.ans;
for(int i=0;i<4;i++){
int sx=t.space/3+dx[i];
int sy=t.space%3+dy[i];
if(sx>=3||sy>=3||sx<0||sy<0){
continue;
}
Puzzle f;
f.ans=t.ans+1;
f.space=sx*3+sy;
// cout<<sx<<" "<<sy<<endl;
memcpy(f.e,t.e,sizeof(t.e));
swap(f.e[sx*3+sy],f.e[t.space]);
if(!kangtuo(f.e)) continue;
q.push(f);
}
}
}
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // debug
ACCELERATE;
mm(state,0);
for(int i=0;i<9;i++){
cin>>tmp.e[i];
if(tmp.e[i]==0){
tmp.e[i]=9;
tmp.space=i;
tmp.ans=0;
}
}
int ans=bfs();
cout<<ans<<endl;
return 0;
}