仙岛求药

少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵 岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M x N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

输入格式
第一行输入两个非零整数M和N,两者均不大于20。M示迷阵行数N表示迷阵列数。
接下来有M行,每行包含N个字符,不同字符分别代表不同含义:(1) ‘@’:少年李逍遥所在的位置; (2) ”可以安全通行的方格; (3) ‘#’:有怪物的方格; (4) *:仙药所在位置。
输出格式
输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药则输出-1。

输入样例1:

8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###

输出样例1:

10

输入样例2:

6 5
.*.#.
.#...
..##.
.....
.#...
....@

输出样例2:

8

代码运行超时。
有大佬知道如何剪枝欢迎留言一起讨论。

#include <iostream>
using namespace std;
const int N = 25;
char s[N][N];
bool vis[N][N];
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int ans = 999999;
int m, n;
void dfs(int x, int y, int step)
{
	if (s[x][y] == '#' || x < 0 || x >= m || y < 0 || y >= n)
	{
		return;
	}
	if (step > ans)
	{
		return;
	}
	if (s[x][y] == '*')
	{
		ans = min(ans, step); 
	}
	for (int i = 0; i < 4; i++)
	{
		int tx = x + dir[i][0];
		int ty = y + dir[i][1];
		if (!vis[x][y])
		{
			vis[x][y] = 1;
			dfs(tx, ty, step + 1);
			vis[x][y] = 0;
		}
	}
}
int main()
{
	
	cin >> m >> n;
	for (int i = 0; i < m; i++)
	{
		scanf("%s", s[i]);
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (s[i][j] == '@')
			{
				dfs(i, j, 0);
				break;
			}
		}
	}
	if (ans == 999999)
	{
		cout << -1 << endl;
	}
	else
	{
		cout << ans << endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值