概述
题目描述
小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距离需要消耗1点体力值,向上爬一个单位距离需要消耗3个单位的体力值,向下移动不消耗体力值,当小青蛙的体力值等于0的时候还没有到达出口,小青蛙将无法逃离迷宫。现在需要你帮助小青蛙计算出能否用仅剩的体力值跳出迷宫(即达到(0,m-1)位置)。
输入描述:
输入包括n+1行: 第一行为三个整数n,m(3 <= m,n <= 10),P(1 <= P <= 100) 接下来的n行: 每行m个0或者1,以空格分隔
输出描述:
如果能逃离迷宫,则输出一行体力消耗最小的路径,输出格式见样例所示;如果不能逃离迷宫,则输出"Can not escape!"。 测试数据保证答案唯一
示例1
输入
4 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1
输出
[0,0],[1,0],[1,1],[2,1],[2,2],[2,3],[1,3],[0,3]
思路:
递归+回溯。从起始位置开始,向上下左右四个方向分别前进一步,然后加上前进所要消耗的体力值,若某个位置为0,或下一个位置越界,或该位置已访问过,则跳出递归。
若到达出口位置,比较体力消耗值是否大于青蛙总共拥有的体力值,且同时小于目前最小的体力消耗值;若是,则更新最小体力消耗值和路径。
#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;
}
最后
以上就是虚心丝袜为你收集整理的编程题——地下迷宫的全部内容,希望文章能够帮你解决编程题——地下迷宫所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复