國慶七連測(二) 八數碼
阿新 • • 發佈:2018-12-13
裸題,然而逆序對判可行性時出了點偏差,wa了三個點,正解直接跑一遍即可。 不多說上程式碼 Code:
#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long dx[5]={-1,0,0,1},dy[5]={0,-1,1,0};
long long n,m,c[3][3];
queue <long long> q;
map <long long,long long> mp;
int main()
{
for(int i=1;i<=9;i++)
{
int x;
scanf("%d",&x);
n=n*10+x;
}
for(int i=1;i<=9;i++)
{
int x;
scanf("%d",&x);
m=m*10+x;
}
if(n==m) {printf("0");return 0;}
q.push(n);
mp[n]=0;
while(!q.empty())
{
int u=q.front();
int x=0,y=0,tmp=u;
q.pop();
if(u==m) break;
for(long long i=2;i>=0;i--)
for(long long j=2;j>=0;j--)
{
c[i][j]=tmp%10,tmp/=10;
if(!c[i][j]) x=i,y=j;
}
for(long long i=0;i<4;i++)
{
long long nx=x+dx[i],ny=y+dy[i],now=0;
if(nx<0 || ny<0 || nx>2 || ny>2) continue;
swap(c[nx][ny],c[x][y]);
for(long long i=0;i<3;i++)
for(long long j=0;j<3;j++)
now=now*10+c[i][j];
if(!mp.count(now))
{
mp[now]=mp[u]+1;
q.push(now);
}
swap(c[nx][ny],c[x][y]);
}
}
if(!mp[m]) printf("-1");
else printf("%lld",mp[m]);
return 0;
}