#12WA 97pts求助(A*)
查看原帖
#12WA 97pts求助(A*)
658022
zhengjiawei楼主2023/1/10 15:36
//A*
//writed by zhengjiawei on January 10th,2023
#include<bits/stdc++.h>

using namespace std;

int num,ans=INT_MAX;

struct matrix{
	int b[5][5];
	bool operator < (const matrix&hhh) const{
		for(int i=1;i<=3;++i)
			for(int j=1;j<=3;++j)
				if(b[i][j]!=hhh.b[i][j]) return b[i][j]<hhh.b[i][j];
		return b[1][1]!=hhh.b[1][1];
	}
}aa;

matrix val;

int h(matrix x){
    int res=0;
    for(int i=1;i<=3;++i)
    	for(int j=1;j<=3;++j)
    		if(x.b[i][j]!=val.b[i][j])
    			++res;
    return res;
}



map <matrix,bool> a;

struct node{
    matrix y;
	int h1,s;
    bool operator < (const node&hhh) const{
        return s+h1>hhh.s+hhh.h1;
    }
};

priority_queue <node> q;

void bfs(){
    q.push(node{aa,h(aa),0});
    a[aa]=true;
    while(!q.empty()){
    	//cout<<1;
        node w=q.top();q.pop();
        matrix k=w.y;
		if(h(k)==0){
    		ans=min(ans,w.s);
    		break;
		}
        for(int i=1;i<=3;++i){
        	for(int j=1;j<=3;++j){
        		if(k.b[i][j]==0){
        			if(i!=1){
        				swap(k.b[i-1][j],k.b[i][j]);
        				if(!a[k]){
        					q.push((node){k,h(k),w.s+1});a[k]=true;
						} 
        				swap(k.b[i-1][j],k.b[i][j]);
					}
					if(i!=3){
        				swap(k.b[i+1][j],k.b[i][j]);
        				if(!a[k]){
        					q.push((node){k,h(k),w.s+1});a[k]=true;
						}
        				swap(k.b[i+1][j],k.b[i][j]);
					}
					if(j!=3){
        				swap(k.b[i][j+1],k.b[i][j]);
       					if(!a[k]){
        					q.push((node){k,h(k),w.s+1});a[k]=true;
						}
        				swap(k.b[i][j+1],k.b[i][j]);
					}
					if(j!=1){
        				swap(k.b[i][j-1],k.b[i][j]);
        				if(!a[k]){
        					q.push((node){k,h(k),w.s+1});a[k]=true;
						}
        				swap(k.b[i][j-1],k.b[i][j]);
					}
				}
			}
		}		 
	}
}

int main(){
    cin>>num;
	for(int i=3;i;--i)
		for(int j=3;j;--j){
			aa.b[i][j]=num%10;
			num/=10;
		}
	val.b[1][1]=1,val.b[1][2]=2,val.b[1][3]=3,val.b[2][1]=8,val.b[2][2]=0,val.b[2][3]=4,val.b[3][1]=7,val.b[3][2]=6,val.b[3][3]=5;
	bfs();
	cout<<ans;
    return 0;
}
2023/1/10 15:36
加载中...