罗密欧与朱丽叶的迷宫问题

问题描述
罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。每改变一次前进方向算作转弯一次。请设计一个算法帮助罗密欧找出这样一条道路。

罗密欧与朱丽叶的迷宫
.编程任务:
对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少转弯道路。
.数据输入:
由文件input.txt给出输入数据。第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2 个正整数,表示被封闭的房间所在的行号和列号。最后的2 行,每行也有2 个正整数,分别表示罗密欧所处的方格(p,q)和朱丽叶所处的方格(r,s)。
.结果输出:
将计算出的罗密欧通向朱丽叶的最少转弯次数和有多少条不同的最少转弯道路输出到文件output.txt。文件的第一行是最少转弯次数。文件的第2 行是不同的最少转弯道路数。接下来的n行每行m个数,表示迷宫的一条最少转弯道路。A[i][j]=k表示第k步到达方格(i,j);A[i][j]=-1 表示方格(i,j)是封闭的。
如果罗密欧无法通向朱丽叶则输出“No Solution!”。
输入文件示例
input.txt
3 4 2
1 2
3 4
1 1
2 2

输出文件示例
output.txt
6
7
1 -1 9 8
2 10 6 7
3 4 5 -1

#include <iostream>
#include <fstream>
using namespace std;//罗密欧与朱丽叶的迷宫问题
/*该题可以使用回溯的方式来解决,因为仔细观察之后,你其实可以发现,罗密欧无论在每一个位置最多有8中选择,其实就是一个节点到达下一层的路径;回溯法最重要的就是判断这是一种甚么类型的问题? 无非两种:1. 子集问题 2. 全排列问题问题需要把所有的可通过房间都走过一遍且在每个房间都有八种选择--->无非就是子集问题起始点时根节点,叶结点时终点之后就是常规的回溯模板套进去!
*/struct Point
{int x, y;
};
Point luo;
Point ye;
Point pos;//    定义八个方向
int dx[8] = { 1, 0, -1, 0, 1, 1, -1, -1 }; //八个方向
int dy[8] = { 0, 1, 0, -1, 1, -1, 1, -1 };const int MAX = 10;
int n, m, k;
int board[MAX][MAX];
int best[MAX][MAX];
int curr_rotation = 0;  //转弯次数
int min_rotation = 100000;   //最少转弯次数
int min_count = 0;  //不同的最少转弯道路数
bool flag = false;bool Point_check(Point pos) {if (pos.x > 0 && pos.x <= n && pos.y > 0 && pos.y <= m && board[pos.x][pos.y] == 0)return true;return false;
}// 更新当前最少转弯情况下的路线
void upgrade() {for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)best[i][j] = board[i][j];flag = true;
}// 回溯算法--->形式参数表示的是traceBack的层数
void  traceBack(int depth, Point pos, int di) {/*回溯法的终止条件,当  把所有的空房间都遍历一般且   当前到达的位置是朱丽叶的位置且 当前转弯的次数少于等于历史的次数*/  if (depth == m * n - k && pos.x == ye.x && pos.y == ye.y && curr_rotation <= min_rotation) {/*如果当前的curr_count小于min_rotation更新min_rotation、min_count以及路径图*/if (curr_rotation < min_rotation) {min_rotation = curr_rotation;min_count = 1;//   更新路径图upgrade();}else {min_count++;}return;}else {//   剪枝策略-----当到达这个位置的时候curr_rotation已经大于min_rotation那么进行剪枝for (int i = 0; i < 8; i++) {// 通过走的方向,计算下一个位置Point next_pos;next_pos.x = pos.x + dx[i];next_pos.y = pos.y + dy[i];//    每次走一步需要判断你下一个地点的位置是否合法if (Point_check(next_pos)) {board[next_pos.x][next_pos.y] = depth + 1;if (depth > 1 && di != i)curr_rotation++;if (curr_rotation <= min_rotation)traceBack(depth + 1, next_pos, i);//    进行回溯board[next_pos.x][next_pos.y] = 0;if (depth > 1 && di != i)curr_rotation--;}}}
}int main() {// 迷宫的初始化memset(board, 0, sizeof(board));memset(best,0,sizeof(board));//   文件的输入ifstream datain("input_data_1.txt");cout << "输入迷宫的宽度:"; datain >> n; cout << n<<endl;cout << "\n输入迷宫的长度:"; datain >> m; cout << m << endl;cout << "\n输入封闭房间个数:"; datain >> k; cout << k << endl;//    封闭房间数据的输入for (int i = 0; i < k; i++) {Point forbidden_rooms;datain >> forbidden_rooms.x >> forbidden_rooms.y;board[forbidden_rooms.x][forbidden_rooms.y] = -1;}//    输入罗密欧和朱丽叶的位置信息datain >> luo.x >> luo.y;cout << endl << "罗密欧位置坐标:[" << luo.x << ", " << luo.y << "]" << endl;board[luo.x][luo.y] = 1;datain >> ye.x >> ye.y;cout << endl << "朱丽叶位置坐标:[" << ye.x << ", " << ye.y << "]" << endl;// 回溯算法开始traceBack(1, luo, 0);//   把结果输出到txt文件中ofstream dataout("output_data1.txt", ios::trunc);if (flag) {dataout << min_rotation << endl;cout << "\n最小转弯次数:" << min_rotation << endl;dataout << min_count << endl;cout << "\n最小转弯次数的转弯道路数:" << min_count << endl;cout << "行走的路线图:" << endl;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {dataout << best[i][j] << " ";cout << best[i][j] << " ";}dataout << endl;cout << endl;}}else {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {//dataout << best[i][j] << " ";cout << board[i][j] << " ";}//dataout << endl;cout << endl;}dataout << "No Solution!" << endl;cout<< "\nNo Solution!" << endl;}return 0;
}

罗密欧与朱丽叶的迷宫问题----回溯法相关推荐

  1. 罗密欧与朱丽叶的迷宫问题(java版带有详细分析与注释)

    罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫问题 罗密欧与朱丽叶身处一个 $m×n $的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这 m × n m×n m×n 个房间中有一些房间 ...

  2. 罗密欧与朱丽叶的迷宫问题

    罗密欧与朱丽叶的迷宫问题         问题描述:  罗密欧与朱丽叶的迷宫.罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许 ...

  3. 罗密欧与朱丽叶的迷宫

    2010-1-26抄题目于此,看何时能有代码解决. 问题描述: 罗密欧与朱丽叶的迷宫.罗密欧与朱丽叶身处一个m×n的迷宫中.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任 ...

  4. 罗密欧与朱丽叶的迷宫问题_dfs

    罗密欧与朱丽叶的迷宫问题 问题描述: 罗密欧与朱丽叶的迷宫.罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫 ...

  5. 算法设计与分析: 5-12 罗密欧与朱丽叶的迷宫问题

    5-12 罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫.罗密欧与朱丽叶身处一个 m×n 的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这 m×n 个房间中有一些房间是封闭的,不允许任 ...

  6. P1605 迷宫 dfs回溯法

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  7. 17084 罗密欧与朱丽叶的迷宫问题

    #include <iostream> using namespace std; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h&g ...

  8. c语言最短加法链问题回溯法,《回溯法习题》PPT课件.ppt

    1,课程安排,第5章 回溯法习题课,3,第5章 回溯法习题,子集和问题 最小长度电路板排列问题 最小重量机器设计问题 运动员最佳匹配问题 无分隔符字典问题 无和集问题 n色方柱问题 整数变换问题 拉丁 ...

  9. 回溯法+奇偶剪枝——Hdu 1010 Tempter of the Bone

    1)   题目 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

最新文章

  1. mysql 多库多表_shell脚本建多库、多表、多实例(mysql)
  2. android中static方法,StaticLayout如何在Android中使用?
  3. TCP滑动窗口(Sliding Window)原理
  4. 【tool】网站测试分类
  5. 传统方法怎么玩计算机审美
  6. 在Flash CS6中安装动画辅助制作插件DragonBones
  7. 复旦研究生怒怼华为:2w 月薪是侮辱价!
  8. oracle大量数据删除
  9. 机器学习篇-指标:AUC
  10. 【转】VS2005 CTP 版本这个CTP是什么意思
  11. 延长汽车寿命的6个良好习惯
  12. 一起看一下主流应用使用了哪些三方库
  13. Hadoop技术在商业智能BI中的应用
  14. cup first world_LOONCUP – The world's first SMART menstrual cup.
  15. 论文都看不懂,你还搞什么人工智能?
  16. 微信小程序实现浮动按钮
  17. 计算机入门建模观后感,实习生revit学习心得-初学Revit有感
  18. 大学生必备的几个公众号
  19. 51单片机之《概述》
  20. 《嵌入式 – GD32开发实战指南》第5章 跳动的心脏-Systick

热门文章

  1. 为什么苹果原装数据线容易破皮?怎么解决苹果数据线损坏问题
  2. vxworks和linux双系统,vxworks和dos双启动
  3. Ubuntu解决 The following signatures couldn‘t be verified because the public key is not available:
  4. Python 能预约自动预约脚本
  5. java毕业设计——基于JSP+sqlserver的网络在线考试系统设计与实现(毕业论文+程序源码)——在线考试系统
  6. “只有抄袭是真的”——转载《南方周末》7月23日
  7. 270 元直邮中国!iHerb 靠什么吸引着众多海淘人的内心?
  8. html背景图片怎么设置平铺,html怎么设置背景图片平铺方
  9. 基于springboot+vue的个人健康信息服务平台
  10. 脱不下孔乙己的长衫,现代的年轻人该怎么办?