第七个数据点TLE的童鞋们看过来
查看原帖
第七个数据点TLE的童鞋们看过来
250145
Lethifold楼主2021/8/19 08:28

大家可能会写个check函数来判断从某点能否转移到下一个点

然而,由于本题的数据过虐,这样写就会导致一个点TLE

把check函数的内容直接放到if里就好啦

这是TLE代码

#include<cstdio>
#define N 110
using namespace std;
int n,m,t,sx,sy,ex,ey,ans;
bool bj[N][N];
const int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1};
int ABS(int x){return (x>0)?x:-x;}
bool check(int x,int y){return (x>=1)&&(y>=1)&&(x<=n)&&(y<=m)&&(!bj[x][y]);}//注意这里!!
void dfs(int x,int y,int T){
	if(x==ex&&y==ey&&t==T){
		ans++;
		return;
	}
//	printf(":%d %d\n",x,y);
	int r=t-T;
	if(ABS(x-ex)+ABS(y-ey)>r||r==0)return;
	for(int i=0;i<4;i++){
		int xxx=x+xx[i],yyy=y+yy[i];
		if(check(xxx,yyy))dfs(xxx,yyy,T+1);
	}
	return;
}
int main(){
//	freopen("a.in","r",stdin);
	scanf("%d%d%d",&n,&m,&t);
	for(int i=1;i<=n;i++){
		scanf("\n");
		for(int j=1;j<=m;j++){
			char ch;
			scanf("%c",&ch);
			if(ch=='*')bj[i][j]=true;
		}
	}
	scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
	dfs(sx,sy,0);
	printf("%d\n",ans);
	return 0;
}

这是AC代码

#include<cstdio>
#define N 110
using namespace std;
int n,m,t,sx,sy,ex,ey,ans;
bool bj[N][N];
const int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1};
int ABS(int x){return (x>0)?x:-x;}
void dfs(int x,int y,int T){
	if(x==ex&&y==ey&&t==T){
		ans++;
		return;
	}
//	printf(":%d %d\n",x,y);
	int r=t-T;
	if(ABS(x-ex)+ABS(y-ey)>r||r==0)return;
	for(int i=0;i<4;i++){
		int xxx=x+xx[i],yyy=y+yy[i];
		if((x>=1)&&(y>=1)&&(x<=n)&&(y<=m)&&(!bj[x][y]))dfs(xxx,yyy,T+1);//把上面check函数的内容直接放到这里
	}
	return;
}
int main(){
//	freopen("a.in","r",stdin);
	scanf("%d%d%d",&n,&m,&t);
	for(int i=1;i<=n;i++){
		scanf("\n");
		for(int j=1;j<=m;j++){
			char ch;
			scanf("%c",&ch);
			if(ch=='*')bj[i][j]=true;
		}
	}
	scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
	dfs(sx,sy,0);
	printf("%d\n",ans);
	return 0;
}

之前做别的题的时候也遇到过这种情况,当时调了我一个多小时QAQ

2021/8/19 08:28
加载中...