1. 程式人生 > >國慶七連測(二) 八數碼

國慶七連測(二) 八數碼

裸題,然而逆序對判可行性時出了點偏差,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; }