求助,去掉哈希能过,加上60
查看原帖
求助,去掉哈希能过,加上60
577421
Irithyll楼主2024/9/3 14:55
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
char c;
int ton[maxn]; 
int t,a[10][10],idx,idy;
int g[10][10],num;
const int dx[]={1,1,-1,-1,2,2,-2,-2};
const int dy[]={2,-2,2,-2,1,-1,1,-1};
int f,ans;
int js(){
    int h=0;
    for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(a[i][j]!=g[i][j])h++;
		} 
	}    
    return h;
}
int check(){
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(a[i][j]!=g[i][j]){
				//cout<<i<<" "<<j<<" "<<a[i][j]<<" "<<g[i][j]<<endl; 
				return 0;
			}
		}
	}
	return 1;
}
int hash_(){
	int k=0;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			k+=(a[i][j]+101)*i*(j+7)+(a[i][j]+311)*i+(a[i][j]+2)*j+(a[i][j]+207)*(i+j)+(a[i][j]+11)*(a[i][j]+11)*(i*i)*j;
		}
	}
	return k;
}
void dfs(int x,int y,int dep,int lim){
	//cout<<dep<<endl;
	 
	if(dep==lim){
		if(check()){
			ans=dep;
			f=1;
		}
		return;
	}
	for(int i=0;i<8;i++){
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<1||nx>5||ny<1||ny>5)continue;
		swap(a[x][y],a[nx][ny]);
		num=hash_();
		//if(dep==0&&lim==1)cout<<ton[num]<<endl;
		if(ton[num]<=dep-1){
			//cout<<dep<<endl;
			swap(a[x][y],a[nx][ny]);
			continue;
		}
		int q=ton[num];
		ton[num]=dep+1;
		//cout<<dep<<" "<<lim<<endl;
		if(dep+js()<=lim)dfs(nx,ny,dep+1,lim);
		ton[num]=q;
		swap(a[x][y],a[nx][ny]);
	}
	return;
}
int main(){
	for(int i=1;i<=5;i++){
		g[1][i]=1;g[5][i]=0;
	}
	for(int i=1;i<=4;i++){
		g[4][i]=0;g[2][6-i]=1;
	}
	g[2][1]=0;g[4][5]=1;
	g[3][1]=g[3][2]=0;g[3][4]=g[3][5]=1;
	g[3][3]=2;
	cin>>t;
	while(t--){
		memset(a,0,sizeof(a));
		for(int i=1;i<=maxn;i++){
			ton[i]=INT_MAX;
		}
		f=0;
		//ans=20;
		for(int i=1;i<=5;i++){
			for(int j=1;j<=5;j++){
				cin>>c;
				if(c=='1')a[i][j]=1;
				else if(c=='0')a[i][j]=0;
				else{
					a[i][j]=2;
					idx=i;idy=j;
				} 
			}
		}
		num=hash_();
		ton[num]=0;
		for(int i=1;i<=15;i++){
			dfs(idx,idy,0,i);
			if(f==1){
				cout<<ans<<endl;
				break;
			}
		}
		if(f==0)cout<<-1<<endl;
	}
	return 0;
} 
2024/9/3 14:55
加载中...