题目描述
小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距离需要消耗1点体力值,向上爬一个单位距离需要消耗3个单位的体力值,向下移动不消耗体力值,当小青蛙的体力值等于0的时候还没有到达出口,小青蛙将无法逃离迷宫。现在需要你帮助小青蛙计算出能否用仅剩的体力值跳出迷宫(即达到(0,m-1)位置)。
输入描述:
复制代码
1
2
3
4输入包括n+1行: 第一行为三个整数n,m(3 <= m,n <= 10),P(1 <= P <= 100) 接下来的n行: 每行m个0或者1,以空格分隔
输出描述:
复制代码
1
2如果能逃离迷宫,则输出一行体力消耗最小的路径,输出格式见样例所示;如果不能逃离迷宫,则输出"Can not escape!"。 测试数据保证答案唯一
示例1
输入
复制代码
1
2
3
4
54 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1
输出
复制代码
1[0,0],[1,0],[1,1],[2,1],[2,2],[2,3],[1,3],[0,3]
思路:
递归+回溯。从起始位置开始,向上下左右四个方向分别前进一步,然后加上前进所要消耗的体力值,若某个位置为0,或下一个位置越界,或该位置已访问过,则跳出递归。
若到达出口位置,比较体力消耗值是否大于青蛙总共拥有的体力值,且同时小于目前最小的体力消耗值;若是,则更新最小体力消耗值和路径。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76#include<iostream> #include<vector> using namespace std; int n, m, p, step = 999999; vector<int> res; int a[10][10]; bool visit[10][10]; void escape(vector<int>&tmp, int sum, int i, int j) { if ( i==0 && j == m-1) { if (sum <= p && sum <step ){ step = sum; res = tmp; } return ; } if ( i-1>=0 && a[i-1][j] == 1 && visit[i-1][j]==0) { sum += 3; tmp.push_back(i-1); tmp.push_back(j); visit[i-1][j] = 1; escape(tmp, sum, i-1, j); sum -= 3; tmp.pop_back(); tmp.pop_back(); visit[i-1][j] = 0; } if ( i+1 <n && a[i+1][j] == 1 && visit[i+1][j]==0) { tmp.push_back(i+1); tmp.push_back(j); visit[i+1][j] = 1; escape(tmp, sum, i+1, j); tmp.pop_back(); tmp.pop_back(); visit[i+1][j] = 0; } if ( j-1>=0 && a[i][j-1]==1 && visit[i][j-1]==0) { sum += 1; tmp.push_back(i); tmp.push_back(j-1); visit[i][j-1] = 1; escape( tmp, sum, i, j-1); sum -= 1; tmp.pop_back(); tmp.pop_back(); visit[i][j-1] = 0; } if ( j+1<m && a[i][j+1]==1 && visit[i][j+1]==0) { sum += 1; tmp.push_back(i); tmp.push_back(j+1); visit[i][j+1] = 1; escape(tmp, sum, i, j+1); sum -= 1; tmp.pop_back(); tmp.pop_back(); visit[i][j+1] = 0; } } int main() { cin>>n>>m>>p; for(int i=0; i<n; i++) for(int j=0; j<m; j++) cin>>a[i][j]; vector<int> tmp; int sum = 0; tmp.push_back(0);tmp.push_back(0); visit[0][0] = 1; escape(tmp, sum, 0, 0); if (step == 999999) cout<<"Can not escape!"; else { int size = res.size(); for (int i=0; i<size-2; i+=2) { cout<<"["<<res[i]<<","<<res[i+1]<<"]"<<","; } cout<<"["<<res[size-2]<<","<<res[size-1]<<"]"; } return 0; }
最后
以上就是虚心丝袜最近收集整理的关于编程题——地下迷宫的全部内容,更多相关编程题——地下迷宫内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复