经典的深搜,要注意剪枝,不然会TLE。剪枝有三类:1. 起点到终点的距离必须>t。 2. t > 所有非障碍数。 3. 起点与终点距离的奇偶性要与时间t一致。 因为输入有问题,导致WA了N久,郁闷!后来猜想可能每句最后可能不止一个换行符。将逐字符输入改成逐行输入,即AC。
之前的代码:
#include<stdio.h> #include<stdlib.h> #include<math.h> char maze[52][52]; int n,m,t,flag; int sx,sy,dx,dy;//sx,sy起点,dx,dy终点 void dfs(int x,int y,int step) { int dict[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; if(x<=0||y<=0||x>n||y>m) return ; if(step==t&&x==dx&&y==dy) { flag=1; } if(flag==1) return; int temp=t-step-abs(x-dx)-abs(y-dy);//temp=时间-步长-剩下的距离 if(temp<0) return;//temp<0或为偶数,return for(int i=0;i<4;i++){ int temp_x = x+dict[i][0]; int temp_y = y+dict[i][1]; if(temp_x<=0||temp_y<=0||temp_x>n||temp_y>m) continue; if(maze[temp_x][temp_y]!='X'){ maze[temp_x][temp_y]='X'; dfs(temp_x,temp_y,step+1); maze[temp_x][temp_y]='.'; } } return; } int main() { while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(n==0&&m==0&&t==0) break; int wall=0; flag=0; for(int i=1;i<=n;i++){ getchar(); for(int j=1;j<=m;j++){ scanf("%c",&maze[i][j]); if(maze[i][j]=='X') wall++; else if(maze[i][j]=='S') sx=i,sy=j; else if(maze[i][j]=='D') dx=i,dy=j; } } if( !( (dx+dy)&1 )^((sx+sy)&1)){ printf("NO\n"); continue; } if(n*m-wall<=t)//t要大于所有非障碍数 { printf("NO\n"); continue; } maze[sx][sy]='X'; dfs(sx,sy,0); if(flag==1) printf("YES\n"); else printf("NO\n"); } return 0; }
将逐字符输入改成逐行输入即AC。
#include<stdio.h> #include<stdlib.h> #include<math.h> char maze[52][52]; int n,m,t,flag; int sx,sy,dx,dy;//sx,sy起点,dx,dy终点 void dfs(int x,int y,int step) { int dict[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; if(x<=0||y<=0||x>n||y>m) return ; if(step==t&&x==dx&&y==dy) { flag=1; } if(flag==1) return; int temp=t-step-abs(x-dx)-abs(y-dy);//temp=时间-步长-剩下的距离 if(temp<0) return;//temp<0或为偶数,return for(int i=0;i<4;i++){ int temp_x = x+dict[i][0]; int temp_y = y+dict[i][1]; if(temp_x<=0||temp_y<=0||temp_x>n||temp_y>m) continue; if(maze[temp_x][temp_y]!='X'){ maze[temp_x][temp_y]='X'; dfs(temp_x,temp_y,step+1); maze[temp_x][temp_y]='.'; } } return; } int main() { while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(n==0&&m==0&&t==0) break; int wall=0; flag=0; for(int i=1;i<=n;i++){ scanf("%s",&maze[i][1]); for(int j=1;j<=m;j++){ //scanf("%c",&maze[i][j]); if(maze[i][j]=='X') wall++; else if(maze[i][j]=='S') sx=i,sy=j; else if(maze[i][j]=='D') dx=i,dy=j; } } if( !( (dx+dy)&1 )^((sx+sy)&1)){ printf("NO\n"); continue; } if(n*m-wall<=t)//t要大于所有非障碍数 { printf("NO\n"); continue; } maze[sx][sy]='X'; dfs(sx,sy,0); if(flag==1) printf("YES\n"); else printf("NO\n"); } return 0; }
最终AC版
#include<stdio.h> #include<stdlib.h> #include<math.h> char maze[52][52]; int n,m,t,flag; int sx,sy,dx,dy;//sx,sy起点,dx,dy终点 void dfs(int x,int y,int step) { int dict[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; if(x<=0||y<=0||x>n||y>m) return ; if(step==t&&x==dx&&y==dy) { flag=1; } if(flag==1) return; //int temp=t-step-abs(x-dx)-abs(y-dy);//temp=时间-步长-剩下的距离 //if(temp<0) return;//temp<0或为偶数,return for(int i=0;i<4;i++){ int temp_x = x+dict[i][0]; int temp_y = y+dict[i][1]; if(temp_x<=0||temp_y<=0||temp_x>n||temp_y>m) continue; if(maze[temp_x][temp_y]!='X'){ maze[temp_x][temp_y]='X'; dfs(temp_x,temp_y,step+1); maze[temp_x][temp_y]='.'; } } return; } int main() { while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(n==0&&m==0&&t==0) break; int wall=0; flag=0; for(int i=1;i<=n;i++){ scanf("%s",&maze[i][1]); for(int j=1;j<=m;j++){ //scanf("%c",&maze[i][j]); if(maze[i][j]=='X') wall++; else if(maze[i][j]=='S') sx=i,sy=j; else if(maze[i][j]=='D') dx=i,dy=j; } } /*if( !( (dx+dy)&1 )^((sx+sy)&1)){ printf("NO\n"); continue; }*/ int temp=t-abs(sx-dx)-abs(sy-dy);//temp=时间-步长-剩下的距离 if(n*m-wall<=t||temp<0||temp&1)//t要大于所有非障碍数 { printf("NO\n"); continue; } maze[sx][sy]='X'; dfs(sx,sy,0); if(flag==1) printf("YES\n"); else printf("NO\n"); } return 0; }