经典的深搜,要注意剪枝,不然会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;
}