您的位置:首页 > 其它

hdu 1010 Tempter of the Bone

2013-01-02 16:39 417 查看
经典的深搜,要注意剪枝,不然会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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU