#9 求助
查看原帖
#9 求助
305770
claran_ran_away楼主2023/3/5 19:54
#include <bits/stdc++.h>
#include <unistd.h>
using namespace std;
int out,t,sx,sy,dx[9] = {0,1,2,2,1,-1,-2,-2,-1},dy[9] = {0,2,1,-1,-2,-2,-1,1,2};
char m[6][6];
char used[6][6]={{0,0,0,0,0,0},{0,'1','1','1','1','1'},{0,'0','1','1','1','1'},{0,'0','0','*','1','1'},{0,'0','0','0','0','1'},{0,'0','0','0','0','0'}};
int ida();//启发式 
void iddfs(int x,int y,int k,int temp);
int main(){
	cin >> t;
	for(int o = 1;o <= t;o++){
		for(int i = 1;i <= 5;i++)
			for(int j = 1;j <= 5;j++){
				cin >> m[i][j];
				if(m[i][j] == '*') sx = i,sy = j;	
			}
		for(int temp = 0;temp <= 15;temp++){
			iddfs(sx,sy,1,temp);
			if(out == 1){
				cout << temp-1 << endl;
				break;
			}
		}
		if(out == 1){
			out = 0;
			continue;
		}
		cout << -1 << endl;
	}
	return 0;
}
void iddfs(int x,int y,int k,int temp){
	if(k == temp){//找到 
		if(!ida()) out = 1; 
		return;
	} 
	if(k + ida()-1 > temp) return;//启发式 
	if(k > temp) return;//迭代加深&结果 
	if(x > 5 || y > 5 || x <= 0 || y <= 0) return;//边界
	//printf("k = %d  ida() = %d\n",k,ida());
	for(int i = 1;i <= 8;i++){
		int xx = x + dx[i],yy = y + dy[i];
		swap(m[x][y],m[xx][yy]);
		iddfs(xx,yy,k+1,temp);
		swap(m[x][y],m[xx][yy]);
	} 
}
int ida(){
	int sum = 0;
	for(int i = 1;i <= 5;i++)
		for(int j = 1;j <= 5;j++)
			if(m[i][j] != used[i][j]) sum++;
	return sum;
}
2023/3/5 19:54
加载中...