为什么开了O2就挂了?求助
查看原帖
为什么开了O2就挂了?求助
828664
Llx2022楼主2023/3/24 17:22
#include<bits/stdc++.h>
using namespace std;
int T; 
char init[6][6];
int dx[9]={0,-2,-2,-1,-1,1,1,2,2};
int dy[9]={0,-1,1,-2,2,-2,2,-1,1};
int an=25;
char ans[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 check(){
	int cnt=0;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(ans[i][j]!=init[i][j]) cnt++;
		}
	}
	return cnt;
}
bool flag;
void dfs(int x,int y,int d,int f){
	if(d>=an) return;
	if(check()+d>16) return ;
	if(check()==0){
		an=d;
		flag=1;
		return ;
	} 
	for(int i=1;i<=8;i++){
		if((dx[i]+x<1)||(dx[i]+x>5)||(dy[i]+y<1)||(dy[i]+y>5)) continue;
		if(i+f!=9){
		swap(init[x][y],init[dx[i]+x][dy[i]+y]);
		dfs(dx[i]+x,dy[i]+y,d+1,i);
		swap(init[x][y],init[dx[i]+x][dy[i]+y]);}
	}
}
int main(){
	scanf("%d",&T);
	for(int i=1;i<=T;i++){
		int x,y;
		an=25;
		flag=0;
		for(int i=1;i<=5;i++){
			scanf("%s",(init[i]+1));
			for(int j=1;j<=5;j++){
				if(init[i][j]=='*'){
					x=i,y=j;
				}
			}
		}
		dfs(x,y,0,0);
		if(!flag) puts("-1");
		else cout<<an<<endl;
		memset(init,0,sizeof(init)); 
	}
	return 0;
}
2023/3/24 17:22
加载中...