当前位置: 首页 > news >正文

QDU 帅气的HYC迷路了(简单搜索+小小模拟)

帅气的HYC迷路了

发布时间: 2015年11月1日 17:02   最后更新: 2015年11月1日 18:40   时间限制: 1000ms   内存限制: 128M

 有一天, 我们帅气的HYC找到了一张藏宝图, 这张图很神奇, 只要你看它一眼, 立马就会被传送到一个迷宫里, 这个迷宫仅有一个出口.那么现在问题来啦, 问你找到这个出口需要走多少步?

    现在给出HYC在迷宫房中走的规则, HYC每走出一步, 都会优先向左走, 如果左边是墙, 那么他会向前走, 如果前边也是墙, 那么他就会向右走, 如果右边也是墙, 那么他只能选择后退了~~~~>_<~~~~

    另外, HYC也想知道如果不这样走, 他最少能走多少步能走出出口呢?

首先给出一个T (1 <= T < 100) 代表T组测试数据
每组测试数据第一行为两个整数r 和 c (3 <= r,c <= 40) r代表这个迷宫有多少列,c代表这个迷宫有多少行.
S表示入口, E表示出口, #表示墙不能走, .表示空白区域, 可以走.
题目保证给出的迷宫四周都是墙, 而且按照规则走总能找到出口, 且初始方向为向北走,快来帮帮他吧!

每组数据输出两个数, 第一个数表示按照规则走的步数, 第二个数表示走到出口最短需要多少步.

  复制
1
9 5
#########
#.#.#.#.#
S.......E
#.#.#.#.#
#########
17 9

好久没写过搜索,都手生了,WA了好几发啊。

按照规则走就是dfs,最短走就是bfs,bfs好写,dfs需要考虑方向的转换,以及后退时也算走一步的处理。

#include <iostream>
#include <string.h>
#include <cstdio>
#include <queue>
using namespace std;
struct node{
	int x, y, stp;
} ft, tl;
queue<node> q;
int nt[4][2] = {0, -1, -1, 0, 0, 1, 1, 0};
int dnt[4][4][2] = {0, -1, -1, 0, 0, 1, 1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, 1, 1, 0, 0, -1, -1, 0, 1, 0, 0, -1, -1, 0, 0, 1};
//四个方向对应的左上右走和后退 
int book[45][45];
char map[45][45];
int n, m, sx, sy, ans1, ans2, flag;
void dfs(int x, int y, int dir){
	if(map[x][y] == 'E'){
		flag = 1;
		return;
	}
	int tx, ty;
	for(int i = 0; i < 4; ++i){
		tx = x + dnt[dir][i][0];
		ty = y + dnt[dir][i][1];
		if(tx < 1 || tx > n || ty < 1 || ty > m) continue;
		if(map[tx][ty] == '#') continue;
		++ans1;
		dfs(tx, ty, (dir+i+3)%4);	//方向转换 
		if(flag) return;
		++ans1;
	}
}
void bfs(int x, int y){
	while(!q.empty()) q.pop();
	int tx, ty;
	tl.x = x, tl.y = y, tl.stp = 1;
	q.push(tl);
	while(!q.empty()){
		ft = q.front(); q.pop();
		if(map[ft.x][ft.y] == 'E'){
			ans2 = ft.stp;
			return;
		}
		for(int i = 0; i < 4; ++i){
			tx = ft.x + nt[i][0];
			ty = ft.y + nt[i][1];
			if(tx < 1 || tx > n || ty < 1 || ty > m) continue;
			if(book[tx][ty] || map[tx][ty] == '#') continue;
			book[tx][ty] = 1;
			tl.x = tx, tl.y = ty, tl.stp = ft.stp+1;
			q.push(tl);
		}
	}
}
int main(){
	int t;
	scanf("%d", &t);
	for(int l = 1; l <= t; ++l)
	{
		scanf("%d %d", &m, &n);
		for(int i = 1; i <= n; ++i){
			scanf("%s", map[i]+1);
			for(int j = 1; j <= m; ++j){
				if(map[i][j] == 'S'){
					sx = i, sy = j;
				}
			}
		}
		ans1 = 1; flag = 0;
		dfs(sx, sy, 0);
		memset(book, 0, sizeof book);
		book[sx][sy] = 1;
		bfs(sx, sy);
		printf("%d %d\n", ans1, ans2);
	}
	return 0;
}

最近开补知识空白区吧,没时间偷懒了。

相关文章:

  • (转)IOS中获取各种文件的目录路径的方法
  • 关于数论乘法逆元及相关知识点
  • ERP对部门经理的好处有哪些
  • Meisell-Lehmer算法(求1...n范围内的素数个数)
  • Oracle 正确删除archivelog文件
  • HDU 5898 数位DP
  • topas解析(AIX)
  • Tarjan算法 模板
  • SQL应用与开发:(六)函数和表达式的使用
  • QDU 帅气的HYC求乘积
  • Android学习初感觉
  • KM算法模板(二分图的最大权匹配)
  • 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...
  • 三分法求凸性函数极大极小值
  • CodeForces 612D
  • 【译】JS基础算法脚本:字符串结尾
  • 08.Android之View事件问题
  • 11111111
  • Android 控件背景颜色处理
  • 从tcpdump抓包看TCP/IP协议
  • 将回调地狱按在地上摩擦的Promise
  • 如何利用MongoDB打造TOP榜小程序
  • 深入 Nginx 之配置篇
  • 深入浅出Node.js
  • 我的业余项目总结
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #考研#计算机文化知识1(局域网及网络互联)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (简单) HDU 2612 Find a way,BFS。
  • (四) Graphivz 颜色选择
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)mysql使用Navicat 导出和导入数据库
  • (转载)利用webkit抓取动态网页和链接
  • *1 计算机基础和操作系统基础及几大协议
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net分布式压力测试工具(Beetle.DT)
  • .Net环境下的缓存技术介绍
  • .NET面试题(二)
  • .NET轻量级ORM组件Dapper葵花宝典
  • @RestControllerAdvice异常统一处理类失效原因
  • @selector(..)警告提示
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C++] 统计程序耗时
  • [C++打怪升级]--学习总目录
  • [C语言]一维数组二维数组的大小
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [idea]关于idea开发乱码的配置
  • [IE编程] 多页面基于IE内核浏览器的代码示例