萌新求助!!97分一个点TLE了 IDA*
查看原帖
萌新求助!!97分一个点TLE了 IDA*
545026
syLph楼主2022/5/13 07:55

就一个点过不去

#include<stdio.h>
#include<math.h>
#include<memory.h>
char temp[4][4];
int mp[3][3],ans,maxdep=0,find=0,stx,sty;
int spx[4]={1,0,-1,0},spy[4]={0,-1,0,1};
int res[3][3]={
    {1,2,3},
    {8,0,4},
    {7,6,5}
};
int abs(int a){return(a<0)?a*-1:a;}
int compress(){
    int res = 0;
    for (int i = 0 ; i < 3 ; i ++ ){
        for (int j = 0; j < 3 ; j ++ ){
            res += mp[i][j] * pow(2,i*3+j);
        }
    }
    return res;
}
int check(){
    for (int i = 0 ; i < 3 ; i ++ ){
        for (int j = 0 ; j < 3 ; j ++ ){
            if ( mp[i][j] != res[i][j] ) return 0;
        }
    }
    return 1;
}
int ch(){
    int rt = 0;
    for (int i = 0 ; i < 3 ; i ++ ){
        for (int j = 0 ; j < 3 ; j ++ ){
            for (int x = 0 ; x < 3 ; x ++ ){
                for (int y = 0 ; y < 3 ; y ++ ){
                    if ( res[x][y] == mp[i][j] && mp[i][j] != 0) {
                        rt += abs(x-i)+abs(y-j);
                    }
                }
            }
        }
    }
    return rt;
}
void print(){
    for (int k = 0 ; k < 3 ; k ++ ){
        for (int j = 0 ; j < 3 ; j ++ ){
            printf("%d ",mp[k][j]);
        }
        puts("");
    }
}
void IDA_star(int x,int y,int dep,int maxdep){
    if ( dep == maxdep && check() ) {
        find = 1;
        ans = maxdep;
        return; 
    }
    int b = ch();
    if ( find == 1 )return;
    if ( dep + ch() > maxdep ) return;
    for (int i = 0 ; i < 4 ; i ++ ){
        int nx = x + spx[i] , ny = y + spy[i];
        if ( nx < 0 || nx >= 3 || ny < 0 || ny >= 3 ) continue;
        int t = mp[nx][ny];
        mp[nx][ny] = mp[x][y];
        mp[x][y] = t; 
        IDA_star(nx,ny,dep+1,maxdep);
        t = mp[nx][ny];
        mp[nx][ny] = mp[x][y];
        mp[x][y] = t; 
    }
//1,2,3
//8,0,4
//7,6,5

//2,8,3    2,0,3    0,2,3    1,2,3
//1,0,4 => 1,8,4 => 1,8,4 => 0,8,4
//7,6,5    7,6,5    7,6,5    7,6,5

}
int main(){
    //freopen("testdata.in","r",stdin);
    for (int i = 0 ; i < 9 ; i ++ ) scanf("%c",&temp[i/3][i%3]);
    for (int i = 0 ; i < 3 ; i ++ ){
        for (int j = 0 ; j < 3 ; j ++ ){
            mp[i][j] = temp[i][j] - '0';
            if (mp[i][j] == 0){
                stx = i;
                sty = j;
            }
        }
    }
    if ( check() ){
        printf("%d",0);
        return 0;
    }
    while (1){
        //memset(buc,0,sizeof(buc));
        maxdep ++;
        IDA_star(stx,sty,0,maxdep);
        if ( find == 1 ){
            printf("%d",ans);
            break;
        }
    }
    return 0;
}
2022/5/13 07:55
加载中...