社区讨论

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 条回复,欢迎继续交流。

正在加载回复...