首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU 1010 Tempter of the Bone(dfs+剪枝)

HDU 1010 Tempter of the Bone(dfs+剪枝)

作者头像
Ch_Zaqdt
发布2019-01-10 11:27:07
2820
发布2019-01-10 11:27:07
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACMZaqdt_ACM

       题意是问从S出发,终点为D,如果能刚好k步到达终点就输出YES,否则输出NO。如果直接深搜会超时,所以这里需要进行奇偶剪枝。

        奇偶剪枝就是比如说不考虑障碍物的情况下起点为S_x,S_y,终点为E_x,E_y,那么起点到终点的最短距离为dist=|S_x-E_x|+|S_y-E_y|,当dist和题目中所需要的走的步数k同奇同偶的时候是可以走到的,否则是一定走不到的。所以这道题就是判断k 和 已经走过的步数+当前点到终点的最短距离的奇偶性是否相同。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 105;
char MAP[MAXN][MAXN];
int vis[MAXN][MAXN];
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int n,m,k,flag,S_x,S_y,E_x,E_y;

int dist(int x1,int y1,int x2,int y2){              // 计算当前点到终点的最短距离
	return (abs(x1-x2)+abs(y1-y2));
}

void dfs(int x,int y, int step){
	if(x == E_x && y == E_y && step == k){
		flag = 1;
		return ;
	}
	if(flag)return ;
	for(int i=0;i<4;i++){
		int X = x + dir[i][0];
		int Y = y + dir[i][1];
	  if(X < 0 || Y < 0 || X >= n || Y >= m || MAP[X][Y] == 'X' || vis[X][Y]) continue;
		//if((1+step+dist(X,Y,E_x,E_y) <= k) &&((dist(X,Y,E_x,E_y)+1+step) % 2 == k % 2)){
			vis[X][Y] = 1;
			dfs(X,Y,step + 1);
			// if(flag)return ;
			vis[X][Y] = 0;
		}
	//}
}

int main()
{
	while(~scanf("%d%d%d",&n,&m,&k)){
		if(n == 0 && m == 0 && k == 0) break;
		flag = 0;
		for(int i=0;i<n;i++){
			scanf("%s",MAP[i]);
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(MAP[i][j] == 'S'){
					S_x = i;
					S_y = j;
				}
				if(MAP[i][j] == 'D'){
					E_x = i;
					E_y = j;
				}
			}
		}
		if((dist(S_x,S_y,E_x,E_y) % 2 != k % 2) || dist(S_x,S_y,E_x,E_y) > k){// 如果最短距离大于k是肯定到不了的
			printf("NO\n");
			continue;
		}
		else{
			memset(vis,0,sizeof(vis));
			vis[S_x][S_y] = 1;
			dfs(S_x,S_y,0);
			if(flag)printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年03月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据处理套件 TBDS
腾讯大数据处理套件(Tencent Big Data Suite,TBDS)依托腾讯多年海量数据处理经验,基于云原生技术和泛 Hadoop 生态开源技术对外提供的可靠、安全、易用的大数据处理平台。 TBDS可在公有云、私有云、非云化环境,根据不同数据处理需求组合合适的存算分析组件,包括 Hive、Spark、HBase、Flink、presto、Iceberg、Alluxio 等,以快速构建企业级数据湖、数据仓库。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档