算法设计 寻宝问题

算法设计 寻宝问题

1. 问题描述
对于某个m*n的字符串数组,相当于一个m行n列的平面形状的方格。里面S表示起点,W表示障碍,B表示可走(但是不一定可以通),X表示出口。对于起点S,有8个方向可以走,当然前提是在没有障碍的情况之下,其中可以分为单步走(on foot)和跳步走(by jump)两种情况,从起点S开始追寻最短的出口路径count2。
在这里插入图片描述

2. 具体要求
Input
输入的第一行是一个整数n (0<=n<=20),表示测试用例的数量。下面的行是n个测试用例的数据。每个测试用例的第一行由两个整数x和y组成(0接下来的x行描述了迷宫矩阵,其中包含x行和y列。在矩阵中,“W”表示屏障,“B”表示可进入的位置,“S”表示起始位置,“X”表示方舟的位置。迷宫矩阵中只有一个S和一个X。
Output
对于每个测试用例,输出一行。如果有问题的解决方案,输出找到方舟的最少步骤的数量。否则输出“NO ANSWER”。
3. 测试数据
Sample Input
3
3 3
SWB
BWB
XBB
5 4
BXWB
BBWS
BBWB
BBWB
BBBB
3 2
WX
WW
WS

Sample Output
2
2
NO ANSWER

代码:

enum class Dir {
    u, r, d, l, lu, ru, ld, rd, n };

/// <summary>
/// 是否能移动到目标位置
/// </summary>
/// <param name="arr">地图</param>
/// <param name="x">数组最大横坐标</param>
/// <param name="y">数组最大纵坐标</param>
/// <param name="nextx">目标位置x</param>
/// <param name="nexty">目标位置y</param>
/// <param name="reach">标志是否已经到达过</param>
/// <returns>是否能移动到目标位置</returns>
bool can(char** arr, int x, int y, int nextx, int nexty, bool** reach)
{
   
	if (nextx > x || nexty > y || nextx < 0 || nexty < 0)	// 是否越界
	{
   
		return false;
	}
	if (arr[nextx][nexty] == 'W')	// 是否是障碍
	{
   
		return false;
	}
	if (reach[nextx][nexty] == true)	// 是否已经到达过
	{
   
		return false;
	}
	return true;
}

/// <summary>
/// 移动
/// </summary>
/// <param name="arr">地图</param>
/// <param name="x">数组最大横坐标</param>
/// <param name="y">数组最大纵坐标</param>
/// <param name="curx">当前位置x</param>
/// <param name="cury">当前位置y</param>
/// <param name="curstep">当前移动不属</param>
/// <param name="dir">移动方向</param>
/// <param name="reach">标志是否已经到达过</param>
/// <param name="minstep">最小步数</param>
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值