蒟蒻求助,爆搜都出错
查看原帖
蒟蒻求助,爆搜都出错
137723
pencil楼主2021/10/4 13:35
#include<iostream>
#include<cmath>
using namespace std;char a[6][6];bool flag=0;
char base[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 dx[9]={0,-2,-2,-1,-1,1,1,2,2};
int dy[9]={0,-1,1,-2,2,-2,2,-1,1};
int minn=15;
int compare(char a2[6][6],char b[6][6]){
	int ans=0;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(a2[i][j]!=b[i][j])
			ans++;
		}
	}
	return ans;
}
void dfs(char now[6][6],int x,int y,int step,int fx,int fy){
	int diff= compare(now,base);
	if(diff==0){
		minn=min(minn,step);flag=1;
	}
	if(diff+step>minn)
		return;
	for(int i=1;i<=8;i++){
		int dix=x+dx[i],diy=y+dy[i];
		if(dix>5||diy>5||dix<1||diy<1||step>15)
			continue;
		if(dix!=fx&&diy!=fy){
			swap(now[x][y],now[dix][diy]);
			dfs(now,dix,diy,step+1,x,y);
			swap(now[x][y],now[dix][diy]);
		}
	}
}
int main() {
	int n,i,o,p,u=1;
	cin>>n;
	int rex,rey,j;
	for(o=1;o<=n;o++){
		minn=15;flag=false;
		for(i=1;i<=5;i++){
			for(j=1;j<=5;j++){
				cin>>a[i][j];
				if(a[i][j]=='*'){
					rex=i;rey=j;
				}
			}
		}
		dfs(a,rex,rey,1,0,0);
		if(flag)
		cout<<minn<<endl;
		else
		cout<<-1<<endl;
	}
	return 0;
}

RT,全是WA

2021/10/4 13:35
加载中...