IDA*死循求调
查看原帖
IDA*死循求调
950927
_luo_gu楼主2024/9/8 18:52
#include <bits/stdc++.h>
#define int long long 
using namespace std ;
int goal[7][7]={
	0,0,0,0,0,0,0,
	0,1,2,2,2,2,0,
	0,1,1,3,2,2,0,
	0,1,1,1,1,2,0,
	0,1,1,1,1,1,0,
	0,0,0,0,0,0,0,
};
int t , ans ;
struct MP{
	int mp[7][7];
};
inline int check( MP aa ){
	int ans = 0 ;
	for(int i=1;i<=5;++i){
		for(int j=1;j<=5;++j){
			ans+=(aa.mp[i][j]!=goal[i][j]);
		}
	}
	return (ans+1)>>1;
}
int movex[10]={0,-2,-1,1,2,2,1,-1,-2,0};
int movey[10]={0,1,2,2,1,-1,-2,-2,-1,0};
inline void IDa_star( int aim_deep , int now_deep , MP aa ){
	int fx=check(aa);
	if(now_deep>=ans){
		return;
	}
	if(fx==0){
		ans=min(ans,now_deep);
		return ;
	}
	if( now_deep+fx >= aim_deep ){
		return ;
	}
	int x , y ;
	bool mar = false ;
	for(int i=1;i<=5;++i){
		for(int j=1;j<=5;++j){
			if(aa.mp[i][j]==3){
				x=i;
				y=j;
				mar=true;
				break;
			}
		}
	}
	for(int i=1;i<=8;i++){
		if(x+movex[i]>5||x+movex[i]<1||y+movey[i]>5||y+movey[i]<1){
			continue ;
		}
		swap(aa.mp[x+movex[i]][y+movey[i]],aa.mp[x][y]);
		IDa_star(aim_deep,now_deep+1,aa);
		swap(aa.mp[x+movex[i]][y+movey[i]],aa.mp[x][y]);
	}
}
MP aa ;
signed main(){
	scanf("%lld",&t);
	while(t--){
		for(int i=1;i<=5;i++){
			for(int j=1;j<=6;j++){
				int c ;
				c=getchar();
				if(c=='0'){
					aa.mp[i][j]=1;
				}else{
					if(c=='1'){
						aa.mp[i][j]=2;
					}else{
						if(c=='*'){
							aa.mp[i][j]=3;
						}
					}
				}
			}
		}
		ans =16;
		for(int i=1;i<=15;i++){
			IDa_star(i,1,aa);
			if(ans!=16){
				printf("%lld\n",&ans);
				return 0;
			}
		}
	} 
}

感谢aker!好人一生平安

2024/9/8 18:52
加载中...