不出答案,大佬求助.......
查看原帖
不出答案,大佬求助.......
1083533
jamig楼主2024/7/29 19:30
#include <bits/stdc++.h>

using namespace std;
const int N = 1e6+5;
int ans = INT_MAX;
int a[N];
bool vis[N];
int dix[5]={0,-3,-1,1,3};
bool check(int x,int newx)
{
    if(x==0){
        if(newx==1||newx==3) return true;
        else return false;
    }
    if(x==1){
        if(newx==0||newx==2||newx==4) return true;
        else return false;
    }
    if(x==2){
        if(newx==1||newx==5) return true;
        else return false;
    }
    if(x==3){
        if(newx==0||newx==4||newx==6) return true;
        else return false;
    }
    if(x==4){
        if(newx==1||newx==3||newx==5||newx==7) return true;
        else return false;
    }
    if(x==5){
        if(newx==2||newx==4||newx==8) return true;
        else return false;
    }
    if(x==6){
        if(newx==3||newx==7) return true;
        else return false;
    }
    if(x==7){
        if(newx==4||newx==6||newx==8) return true;
        else return false;
    }
    if(x==8){
        if(newx==5||newx==7) return true;
        else return false;
    }
}
void print(int x)
{
    string s = to_string(x);
    if(s.size()==8){
        s="0"+s;
    }
    for(int i=0;i<3;i++){
        cout << s[i] << ' ';
    }
    cout << endl;
    for(int i=3;i<6;i++){
        cout << s[i] << ' ';
    }
    cout << endl;
    for(int i=6;i<9;i++){
        cout << s[i] << ' ';
    }
    cout << endl << endl;
}

int jc(int x)
{
    int ans = 1;
    for(int i=2;i<=x;i++){
        ans*=i;
    }
    return ans;
}
int cantor(int x)
{
    string s = to_string(x);
    int len = s.size();
    int ans = 0;
    for(int i=0;i<len;i++){
        int cnt = 0;
        for(int j=i+1;j<len;j++){
            if(s[i]-'0'>s[j]-'0'){
                cnt++;
            }
        }
        ans+=(cnt*jc(len-i-1));
    }
    return ans+1;
}
void dfs(int x,int step,int pl)
{
    if(x==123804765){
        ans = min(ans,step);
        return;
    }
    string s = to_string(x);
    if(s.size()==8) s = "0"+s;
    for(int i=1;i<=4;i++){
        if(check(pl,pl+dix[i])){
            swap(s[pl],s[pl+dix[i]]);
            int t = stoll(s);
            int ct = cantor(t);
            if(!vis[ct]){
                // print(t);
                vis[ct] = true;
                dfs(t,step+1,pl+dix[i]);
                vis[ct] = false;
            }
            swap(s[pl],s[pl+dix[i]]);
        }
    }
}
int main()
{
    int x;
    cin >> x;
    string s = to_string(x);
    int len = s.size();
    int pl = 0;
    for(int i=0;i<len;i++){
        if(s[i]=='0'){
            pl = i;
            break;
        }
    }
    int ct = cantor(x);
    vis[ct] = true;
    dfs(x,0,pl);
    cout << ans;
    return 0;
}

2024/7/29 19:30
加载中...