关于扩展顺序
查看原帖
关于扩展顺序
200044
JS_TZ_ZHR楼主2021/8/9 18:03
#include<bits/stdc++.h>
using namespace std;
int n=3,dy[4]={0,0,1,-1},dx[4]={1,-1,0,0},nx,ny;//这里的dx,dy是对的
int  dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//这样写97
char ch;
struct M{
	int a[5][5];
	bool operator<(const M &x)const{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)if(a[i][j]!=x.a[i][j])return a[i][j]<x.a[i][j];
		return 0;
	} 
} to,sum;
int h(M x){
	int res=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)res+=(x.a[i][j]!=to.a[i][j]);
	return res;
}
struct node{
	M x;
	int t;

	bool operator<(const node &y)const{
		return t+h(x)>y.t+h(y.x);
	}
}now;
priority_queue<node>q;
set<M>s;
int main(){
	to.a[1][1]=1,to.a[1][2]=2,to.a[1][3]=3,to.a[2][1]=8,to.a[2][2]=0,to.a[2][3]=4,to.a[3][1]=7,to.a[3][2]=6,to.a[3][3]=5;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			cin>>ch;
			sum.a[i][j]=ch-'0';
		}
	q.push((node){
		sum,0
	});
	while(!q.empty()){
		now=q.top();
		q.pop();
		if(!h(now.x)){
			cout<<now.t<<endl;
			//continue;
			return 0;
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)if(!now.x.a[i][j])nx=i,ny=j;
		for(int i=0;i<4;i++){
			int Nx=nx+dx[i],Ny=ny+dy[i];
			if(Nx>=1&&Ny>=1&&Nx<=3&&Ny<=3){
				swap(now.x.a[nx][ny],now.x.a[Nx][Ny]);
				if(!s.count(now.x)){
					q.push((node){
						now.x,now.t+1
					});
					s.insert(now.x);
				}
				swap(now.x.a[nx][ny],now.x.a[Nx][Ny]);
			}
		}
	}
}
2021/8/9 18:03
加载中...