• 青蛙走迷宫


    【来源】网传的2017滴滴秋招笔试题

    【问题描述】
    小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。n*m的格子迷宫每个位置为0或者1,1代表可达,0不可达。小青蛙初始在(0,0),地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径)。小青蛙在迷宫中水平移动一个单位距离需耗1个体力值,向上爬一个单位需耗3个体力值,向下移动不消耗体力值。当小青蛙的体力值等于0的时候还没有到达出口,小青蛙将无法逃离迷宫。
    输入描述: 
    输入包括n+1行: 
    第一行为三个整数n,m(3 <= m,n <= 10),P(1 <= P <= 100) 
    接下来的n行: 每行m个0或者1,以空格分隔 
    输出描述: 
    如果能逃离迷宫,则输出一行体力消耗最小的路径,输出格式见样例所示;如果不能逃离迷宫,则输出”Can not escape!”。 
    测试数据保证答案唯一 

    【测试样例】
    输入 
    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]

    【算法思想】

    递归法解,在写程序时重点要理清程序步骤的思路。

    【程序】

     1 #include<iostream>
     2 #include<vector>
     3 #include<string.h>
     4 using namespace std;
     5 
     6 int step_x[4] = {-1,1,0,0};
     7 int step_y[4] = { 0, 0, -1, 1 };
     8 int price[4] = {3,0,1,1};
     9 vector<int> xMax;
    10 vector<int> yMax;
    11 
    12 void frog(int maze[11][11],int flag[11][11],int x,int y,int p,int n,int m,vector<int> xPath,vector<int> yPath,int &max_leftp)
    13 {
    14 
    15     if (p < 0){
    16         return;
    17     }
    18 
    19     if ( x==0 && y==m-1 ){  //抵达终点后
    20         if (max_leftp < p){  //剩余最大体力值存入全局变量Max
    21             max_leftp = p;
    22             xMax = xPath;
    23             yMax = yPath;
    24         }
    25         return;
    26     }
    27 
    28     for (int i = 0; i < 4;i++){
    29         int next_x = x + step_x[i];
    30         int next_y = y + step_y[i];
    31         if (next_x >= 0 && next_x < n && next_y >= 0 && next_y < m && !flag[next_x][next_y] && maze[next_x][next_y]){
    32             flag[next_x][next_y] = 1;
    33             xPath.push_back(next_x);
    34             yPath.push_back(next_y);
    35             frog(maze, flag, next_x, next_y, p-price[i], n, m, xPath, yPath, max_leftp);
    36             flag[next_x][next_y] = 0;
    37             xPath.pop_back();
    38             yPath.pop_back();
    39         }
    40     }
    41 }
    42 
    43 int main(){
    44 
    45     int maze[11][11], flag[11][11];
    46     memset(maze,0,sizeof(maze)); //初始化为0
    47     memset(flag,0,sizeof(flag));
    48     vector<int> xPath, yPath;
    49     int n, m, p, tmp;
    50 
    51     cin>>n>>m>>p;
    52     for (int i = 0; i < n; i++) {
    53         for (int j = 0; j < m; j++) {
    54             cin >> tmp;
    55             maze[i][j]=tmp;
    56         }
    57     }
    58 
    59     //起点
    60     flag[0][0] = 1;
    61     xPath.push_back(0);
    62     yPath.push_back(0);
    63 
    64     int max_leftp = -100;
    65     frog(maze,flag,0,0,p,n,m,xPath,yPath,max_leftp);
    66 
    67     if (max_leftp == -100){
    68         cout << "Can not escape!" << endl;
    69     }
    70 
    71     for (int i = 0; i < xMax.size(); i++){
    72         cout << "[" << xMax[i] << "," << yMax[i] << "]";
    73         if (i<xMax.size()-1)
    74             cout << ",";
    75     }
    76     cout << endl;
    77 
    78     return 0;
    79 }
  • 相关阅读:
    ubuntu16.04左边栏图标效果设置
    VMware虚拟机 Ubuntu 16.04 安装 VMware Tools
    微信换取openid的值
    thinkphp关于T方法
    Think关于循环的事
    base64格式转换为图片
    Think视图模型格式
    thinkphp里多表事务
    ThinkPHP数据库驱动之mysql事物回滚
    webhook是啥?
  • 原文地址:https://www.cnblogs.com/JesusAlone/p/7423801.html
Copyright © 2020-2023  润新知