社区讨论
85求调
P1379八数码难题参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjshzxv
- 此快照首次捕获于
- 2025/11/04 07:47 4 个月前
- 此快照最后确认于
- 2025/11/04 07:47 4 个月前
WA85pts
CPP#include<bits/stdc++.h>
using namespace std;
map<int,int>m;
struct node{
int x[11],s;
};
queue<node>q;
int num(int a[]){
int s=0;
for (int i=0;i<9;i++) s=s*10+a[i];
return s;
}
void bfs(node a,node b){
int pos,r=123804765,n,f[4]={-3,3,-1,1};
q.push(a),q.push(b);
while (!q.empty()){
a=q.front(),q.pop();
for (int i=0;i<9;i++) if (a.x[i]==0){pos=i;break;}
for (int i=0;i<4;i++){
if ((i==0&&pos>2)||(i==1&&pos<6)||(i==2&&pos%3!=0)||(i==3&&pos%3!=2)){
swap(a.x[pos],a.x[pos+f[i]]);
n=num(a.x);
if (n==r&&a.s<1000){
cout<<a.s+1;
return;
}
if (m[n]==0){
m[n]=++a.s;
q.push(a),a.s--;
}else if (m[n]!=-1&&((a.s>=1000&&m[n]<1000)||(a.s<1000&&m[n]>=1000))){
cout<<a.s+1+m[n]-1000;
return;
}
swap(a.x[pos],a.x[pos+f[i]]);
}
}
}
}
int main(){
int n,pos=8;
cin>>n;
node a,b;
if (n==123804765){cout<<0;return 0;};
m[n]=-1;
while (n){
a.x[pos--]=n%10;
n/=10;
}
if (pos==0) a.x[0]=0;
a.s=0;b.s=1000;pos=8;n=12380765;
while (n){
b.x[pos--]=n%10;
n/=10;
}
m[123804765]=-1;
bfs(a,b);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...