0分求助
查看原帖
0分求助
400468
Aakkosetsumussa楼主2022/8/1 23:09
#include<bits/stdc++.h>
using namespace std;
typedef long long inr;
inline inr read() {
	register inr x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
inline void write(inr x) {
	char F[200];
	register inr tmp=x>0?x:-x,cnt=0;
	while(tmp>0) {
		F[cnt++]=tmp%10+'0';
		tmp/=10;
	}
	if(x<0) putchar('-');
	while(cnt>0) putchar(F[--cnt]);
	if(x==0) putchar('0');
	putchar('\n');
}
inr T,suc,sx,sy,a[10][10];
const inr t[7][7]= {
	{0,0,0,0,0,0},
	{0,1,1,1,1,1},
	{0,0,1,1,1,1},
	{0,0,0,2,1,1},
	{0,0,0,0,0,1},
	{0,0,0,0,0,0},
},dx[9]= {0,1,1,-1,-1,2,2,-2,-2},
dy[9]= {0,2,-2,2,-2,1,-1,1,-1};

char c;
inline inr bew() {
	register inr cnt=0;
	for(register inr i=1; i<=5; i++)
		for(register inr j=1; j<=5; j++)
			if(a[i][j]!=t[i][j]) cnt++;
	return cnt;
}
inline void dfs(register inr tf,register inr x,register inr y,register inr tif) {
	if(tf==tif) {
		if(bew()==0) suc=1;
		return;
	}
	for(register inr i=1; i<=8; i++) {
		register inr tx=x+dx[i],ty=y+dy[i];
		if(tx<1||tx>5||ty<1||ty>5) continue;
		swap(a[x][y],a[tx][ty]);
		inr b=bew();
		if(b+tf<=tif) dfs(tf+1,tx,ty,tif);
		swap(a[x][y],a[tx][ty]);
	}
}
int main() {
	T=read();
	while(T--) {
		suc=0;
		for(inr i=1; i<=5; i++) {
			for(inr j=1; j<=5; j++) {
				c=getchar();
				if(c=='*') a[i][j]=2,sx=i,sy=j;
				else a[i][j]=c-'0';
			}
			getchar();
		}
		for(register inr tif=0; tif<=15; tif++) {
			dfs(0,sx,sy,tif);
			if(suc==1) {
				write(tif);
				break;
			}
		}
		if(suc==0) write(-1);
	}
	return 0;
}

样例能过但是0分,求助

2022/8/1 23:09
加载中...