迷宫问题(OJ平台)

http://poj.org/problem?id=3984(这个网址可以A题)

Description

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

此题的思路:

写这道题时想到Codeup上的走迷宫,做法是一样的:用递归的思想,然后在每一层递归时,对迷宫的四个方向进行判断再递归,用int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0}控制四个方向。不同的是:走迷宫这道题是输出所有可能的路径,而这道题只要最短路径的,所以就在递归终点的条件就多了比较路径的 长短,里面多了存目前已知的最短路径的代码
不过这种迷宫的终止条件不是递归的深度到达到某一层,而是走到终点,就return;

代码:

#include<iostream>
using namespace std;int a[6][6], b[6][6];
int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
int Min = 1000, xx, yy;
int px[1000], py[1000], px1[1000], py1[1000];void dfs(int x, int y, int index) {px[index] = x;//用两个数组px[index]和py[index]记录下每个“合格”点的位置py[index] = y;//每层递归的开始就记录下该点位置if(x == 4 && y == 4 && index < Min){//递归终止的条件时走到终点且递归的层数最少Min = index;for(int i = 0; i <= Min; ++i){px1[i] = px[i];//另存最短的路径到px[i]和py[i]py1[i] = py[i]; }        return;         }   for(int i = 0; i < 4; ++i){//遍历四个方向xx = x + dx[i]; //得到下一步的横坐标yy = y + dy[i]; //得到下一步的纵坐标if(a[xx][yy] == 0 && b[xx][yy] == 0 && xx <= 4 && xx >= 0 && yy >= 0 && yy <= 4){ //if语句判断下一步是否可走和走过且是否越界b[x][y] = 1; //标记此点已走过,避免之后重复走dfs(xx, yy, index + 1); b[x][y] = 0; // 还原标记,此处即回溯,之后重新进入for循环找下一个可走的点}}
}int main() {for(int i = 0; i < 5; ++i) for(int j = 0; j < 5; ++j)cin>>a[i][j];   dfs(0, 0 ,0);for(int i = 0; i <= Min; ++i)cout<<"("<<px1[i]<<", "<<py1[i]<<")"<<endl;return 0;
}

附:

在OJ平台上做题时,出现了Presentation Error错误,百度一查,发现是答案接近标准答案,只是答案中多了或少了"\n"和空格。结果一看原来是答案中逗号","后面少了空格,。。。。。OJ可真是严格。再附上我走迷宫的垃圾代码,方便比较异同:

#include<bits/stdc++.h>
using namespace std;int r, c, z1, z2, xx, yy, cnt;
int a[16][16], b[16][16], px[1000], py[1000];
int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
bool flag = false;void dfs (int x, int y, int index) {if( x == z1 && y == z2) {flag = true;for(int i = 1; i < index; ++i) {printf("(%d,%d)->", px[i] , py[i]);}printf("(%d,%d)\n", z1, z2);return;}px[index] = x;py[index] = y;for(int i = 0; i < 4; ++i) {int x1 = x + dx[i];int y1 = y + dy[i];if(a[x1][y1] == 1 && b[x1][y1] == 0 &&  x1 <= r && x1 >= 1 && y1 >= 1 && y1 <= c) {b[x][y] = 1;dfs(x1, y1, index + 1);b[x][y] = 0;}}
}int main() {scanf("%d %d", &r, &c);for(int i = 1; i <= r; ++i) {for(int j = 1; j <= c; ++j) {scanf("%d", &a[i][j]);}}scanf("%d %d", &xx, &yy);scanf("%d %d", &z1, &z2);dfs(xx, yy, 1);if(flag == false) {printf("-1");}return 0;}

路漫漫其修远兮,吾将上下而求索。

迷宫问题(OJ平台)附代码解释相关推荐

  1. 播放失败246106异常代码_美的燃气热水器修理分享(附代码解释)

    上门检修一台美的强排热水器. 试机检查:打开水流,强排风机虽转,未听到燃气电磁阀吸合和燃气火力声音,出水口也只有冷水流出,几秒后显示E2.查相应的代码解释E2:风压异常或风机故障.但观风机运行速度声音 ...

  2. 从一个例子理解多态(附代码解释)

    首先我来说一下多态这个名字是什么意思,多态的英文词是polymorphism,poly的意思是许多,morph的意思是形态.所以多态的意思说白了就是许多形态.那么这许多形态是指谁的形态呢,它是说不同对 ...

  3. ACM 图论入门题(附代码解释)

    目录 HDU 1869 六度分离 HDU 1874 畅通工程续 (最短路) HDU 3339 In Action (最短路+01背包) HDU 1162 Eddy's picture(prime算法) ...

  4. JavaWeb项目——基于Servlet实现的在线OJ平台 (项目问答+代码详解)

    文章目录 项目演示 预先知识 请问 在处理用户同时提交代码时是 多进程处理还是 多线程处理? 你是如何创建多进程的逻辑的 如何获取到编译与运行后的结果? 编译运行模块 子进程之间如何并发? 文件读写操 ...

  5. java 递归_采用递归算法求解迷宫问题(Java版) | 附代码+视频

    递归算法能够解决很多计算机科学问题,迷宫问题就是其中一个典型案例.本篇教程我们将采用递归算法求解迷宫问题,输出从入口到出口的所有迷宫路径. 01 用递归算法解决迷宫问题 迷宫问题在<数据结构教程 ...

  6. 步进电机28BYJ-48的驱动(arduino,STM32平台),最全的驱动详细原理,驱动电路分析,驱动代码解释

    步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细原理,驱动电路分析,驱动代码解释 目录 步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细 ...

  7. 文本相似度计算的简单实例超详细代码解释(附代码,文件)

    任务目标 本次实验是根据淘宝搜索的商品标题来寻找类似的商品标题: 给定一个标题:Apple iPhone 8 (A1863) 64GB 深空灰色 移动联通电信4G手机 找出与其类似的前十个标题: 后面 ...

  8. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  9. 【Python】基于Python的机器学习回归:可视化、预测及预测结果保存(附代码)

    目录 0 一个交互性的软件 0 大无语事件 1 简介 2 数据 3 代码 4 效果 5 关于数据获取 0 一个交互性的软件 基于相关需求,我使用python封装了一个交互性机器学习回归软件,现已依托单 ...

最新文章

  1. jquery对象PHP转换,jquery对象和DOM对象如何相互转换?
  2. NeHe OpenGL教程 第二十三课:球面映射
  3. matlab m 文件例子,一个简单OFDM例子(matlab m文件)
  4. qt on android qml,Qt on Android: Qt Quick 之 Hello World 图文详解
  5. 01.CSS动画--transform
  6. vue watch 修改滚动条_Vue 里的 computed 和 watch 的区别
  7. 网站加载速度 优化_您肯定要优化网站的加载速度。 这是如何做。
  8. 如何使用JMeter自身代理录制APP测试脚本
  9. C#相等性 - 三个方法和一个接口
  10. LeetCode 121买卖股票的时机
  11. uni-app image组件当显示不出图片时显示默认图片
  12. 专题三 PacketTracer 中 MCU 芯片编程基础
  13. android手机定位基站pci的获取,微基站的物理小区号pci确定方法、装置、微基站及宏基站的制作方法...
  14. 如何解决Mac电脑没声音了的问题
  15. 手把手教你如何制作iPhone卡贴(多图)
  16. 计算机专业该如何找实习工作?迷茫、不知所措的你值得一看~
  17. Flutter获取焦点
  18. Python 笑脸抓拍
  19. 智慧城市每年商机超2万亿美元;中德嘉宾共话智慧城市建设 | 智慧城市周报
  20. 秉火429笔记之二寄存器

热门文章

  1. python的socket
  2. 高德百度地图如何获取附近小区酒店银行等?
  3. 【genius_platform软件平台开发】第七十三讲:linux系统驱动开发之-中断处理之DSB指令
  4. 网页框架布局设计_实用的网页设计-框架和框架用法介绍
  5. 音视频入门系列-音视频基础知识篇(录播、点播、直播)
  6. 阿里云服务器部署(2)---配置EMQX服务器(企业版)
  7. 深圳大厂程序员自述:我37岁,年薪百万,等着被公司干掉!
  8. tp6 获取session_TP6文档
  9. 微信QQ邮箱插件,附件Excel 无法打开,或者打开乱码问题
  10. 粒子系统-烟花效果的实现