求助常数
查看原帖
求助常数
234783
conprour楼主2021/9/22 17:31

RT,这道题写的代码过了,但是相较别人跑得飞慢(总共用时稳定 1.26s1.26s) 请问我哪里写的明显常数大吗? 代码如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,mod = 10086,N = 1e5+10;
inline ll read()
{
	ll ret=0;char ch=' ',c=getchar();
	while(!(c>='0'&&c<='9')) ch=c,c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
const int n=5;
const int goal[7][7] = {{},{0,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1},{}};
int dx[]={1,1,2,2,-1,-1,-2,-2};
int dy[]={2,-2,1,-1,2,-2,1,-1};
char s[6][6];
int a[6][6],ans;
inline int check()
{
	int ret=0;
	for(int i=1;i<=n;i++) 
		for(int j=1;j<=n;j++)
			if(a[i][j]!=goal[i][j]) ret+=a[i][j]!=2;
	return ret;
}
bool dfs(int stp,int x,int y,int lim)
{
	if(!check()) return 1;
	if(stp+check()>lim) return 0;
	for(int i=0;i<8;i++)
	{
		int tx=x+dx[i],ty=y+dy[i];
		if(tx<1||tx>n||ty<1||ty>n) continue;
		swap(a[tx][ty],a[x][y]);
		if(dfs(stp+1,tx,ty,lim)) return 1;
		swap(a[tx][ty],a[x][y]);
	}
	return 0;
}
int main()
{
	int T=read();
	while(T--)
	{
		int x,y;
		for(int i=1;i<=5;i++)
		{
			scanf("%s",s[i]+1);
			for(int j=1;j<=5;j++) 
				if(s[i][j]>='0'&&s[i][j]<='9') a[i][j]=s[i][j]-'0';
				else a[i][j]=2,x=i,y=j;
		}
		bool flag=0;
		for(int i=0;i<=15;i++) 
			if(dfs(0,x,y,i)) {printf("%d\n",i),flag=1;break;}
		if(!flag) printf("-1\n");
	}
	return 0;
}

2021/9/22 17:31
加载中...