萌新按照自己理解写了个双向广搜,60分求大佬找下bug谢谢
查看原帖
萌新按照自己理解写了个双向广搜,60分求大佬找下bug谢谢
1224423
tail楼主2024/3/8 23:45
#include<iostream>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
map<int,int> be_m;//用于存储初状态到该状态的代价
map<int,int> fi_m;//用于存储末状态到该状态的代价
int state,ans;
queue<int> be_q;queue<int> fi_q;
int xx[4]={0,-1,1,0},yy[4]={-1,0,0,1};
bool check(int x,int y){
if(x>3||x<1||y>3||y<1)return false;
return true;
}

int deal(int arr[][4]){
    int re=0;
for(int i=3;i>0;i--){
    for(int j=3;j>0;j--){
        re=re*10+arr[i][j];
    }
}
return re;
}

int main(){
cin>>state;
be_m[state]=0;
be_q.push(state);
fi_q.push(123804765);
fi_m[123804765]=0;
bool flag=1;
//开始bfs
while(1){
    //初始状态bfs
    if(be_q.size()<fi_q.size()){
    int be_sta=be_q.front();
    be_q.pop();
    int tmp=be_sta;
    if(fi_m.find(be_sta)!=fi_m.end()){
        ans=fi_m[be_sta]+be_m[be_sta];
        break;
    }
    int arr[4][4];int x,y;
    for(int i=3;i>0;i--){
        for(int j=3;j>0;j--){
            arr[i][j]=tmp%10;
            tmp/=10;
            if(!arr[i][j])x=i,y=j;
        }
    }
    for(int i=0;i<4;i++){
        int x1=x+xx[i],y1=y+yy[i];
        if(check(x1,y1)){
            swap(arr[x][y],arr[x1][y1]);
            //处理,得到新状态
            int re=deal(arr);
            if(be_m.find(re)==be_m.end()){
                be_m[re]=be_m[be_sta]+1;
                be_q.push(re);
            }
            swap(arr[x][y],arr[x1][y1]);
        }
    }
    }

    //末状态bfs
    else{
        int x,y;   int tmp,arr[4][4];
    int fi_sta=fi_q.front();
    fi_q.pop();
    if(be_m.find(fi_sta)!=be_m.end()){
        ans=be_m[fi_sta]+fi_m[fi_sta];
        break;
    }
    tmp=fi_sta;
    for(int i=3;i>0;i--){
        for(int j=3;j>0;j--){
            arr[i][j]=tmp%10;
            tmp/=10;
            if(!arr[i][j])x=i,y=j;
        }
    }
    for(int i=0;i<4;i++){
        int x1=x+xx[i],y1=y+yy[i];
        if(check(x1,y1)){
            swap(arr[x][y],arr[x1][y1]);
            //处理,得到新状态
            int re=deal(arr);
            if(fi_m.find(re)==fi_m.end()){
                fi_m[re]=fi_m[fi_sta]+1;
                fi_q.push(re);
            }

            swap(arr[x][y],arr[x1][y1]);
        }
    }
    }
}
cout<<ans;
}

2024/3/8 23:45
加载中...