大家可能会写个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