hdu 1010 Tempter of the Bone

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值