xdm八数码的代码哪里错了啊,可以过,但是样例过不了
  • 板块学术版
  • 楼主rsy_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/19 16:56
  • 上次更新2023/10/23 18:03:19
查看原帖
xdm八数码的代码哪里错了啊,可以过,但是样例过不了
550775
rsy_楼主2023/4/19 16:56
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <unordered_map>

using namespace std;

int f(string s){
    int res=0,lens=s.size()+;
    for(int i=0;i<lens;i++)
        if(s[i]!='x'){
            int t=s[i]-'1';
            res+=abs(i/3-t/3)+abs(i%3-t%3);
        }
    return res;
}

string bfs(string start){
    int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
    char op[4]={'u','r','d','l'};
    string end="12345678x";
    unordered_map<string,int> dist;
    unordered_map<string,pair<string,char>>prev;
    priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>>heap;
    heap.push({f(start),start}),dist[start]=0;
    while(heap.size()){
        auto t=heap.top();
        heap.pop();
        string state=t.second;
        int lens=state.size();
        if(state==end) break;
        int step=dist[state],x,y;
        for(int i=0;i<lens;i++)
            if(state[i]=='x'){
                x=i/3,y=i%3;
                break;
            }
        string source=state;
        for(int i=0;i<4;i++){
            int a=x+dx[i],b=y+dy[i];
            if(a>=0&&a<3&&b>=0&&b<3){
                swap(state[x*3+y],state[a*3+b]);
              if(!dist.count(state)||dist[state]>step+1){
                  dist[state]=step+1,prev[state]={source,op[i]};
                  heap.push({dist[state]+f(state),state});
                }
                swap(state[x*3+y],state[a*3+b]);
            }
        }
    }
    string res;
    while(end!=start){
        res+=prev[end].second;
        end=prev[end].first;
    }
    reverse(res.begin(),res.end());
    return res;
}
int main(){
    string g,seq,c;
    while(cin>>c){
        g+=c;
        if(c!="x") seq+=c;
    }
    int t=0,lense=seq.size();
    for(int i=0;i<lense;i++)   
        for(int j=i+1;j<lense;j++)
            if(seq[i]>seq[j]) t ++ ;
    if(t&1) puts("unsolvable");
    else cout<<bfs(g)<<'\n';
}
2023/4/19 16:56
加载中...