迷宫

贪婪+回溯---迷宫问题--求解一条路径

落花浮王杯 提交于 2019-11-29 11:58:36
//求一条路径 #include<stdio.h> #include<stdlib.h> #define R 7//行 #define C 8//列 int M[R+2][C+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,1,1,1,1},{1,0,0,0,0,1,1,1,1,1}, {1,1,1,1,0,0,0,0,0,1},{1,0,0,1,1,0,0,0,0,1},{1,0,0,0,1,1,1,0,0,1}, {1,1,0,0,0,1,1,0,0,1},{1,0,0,0,0,0,0,0,0,0},{1,1,1,1,1,1,1,1,1,1}}; int T[R+2][C+2]={0};//标记试探过的路径 int Move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//分别表示向南、东、北、西 int tag; void Print() { printf("迷宫为:\n"); for(int i=1;i<R+1;i++){ for(int j=1;j<C+1;j++){ printf("%d ",M[i][j]); } printf("\n"); } } int Maze(int x,int y) { if(x==R&&y==C){ return 1; } for(int i=0;i<4;i++){//遍历四个方向

【数据结构】简单的迷宫(用递归实现)

倖福魔咒の 提交于 2019-11-28 16:07:28
动态栈的实现 : 点击打开链接 对递归的简单了解 : 点击打开链接 Maze.h #pragma once #include"stack.h" #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include<Windows.h> #define MAX_ROW 4 #define MAX_COL 4 typedef struct Position { int _x; int _y; }Position; typedef struct Maze { int _map[MAX_ROW][MAX_COL]; }Maze; //初始化迷宫 void InitMaze(Maze* m, int map[][MAX_COL]); //检测是否为有效入口 int IsValidEntry(Maze* m, Position entry); //检测是否可以走通 int IsPass(Maze* m, Position cur); //检测是否为出口 int IsExit(Maze* m, Position cur, Position entry); // 真正走迷宫函数 int _PassMaze(Maze* m, Position entry, Position cur, Stack

BFS 迷宫问题+打印路径

匆匆过客 提交于 2019-11-28 05:52:11
问题 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。Input一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。Output左上角到右下角的最短路径,格式如样例所示。Sample Input0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0Sample Output(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4) 题解 (这个题不一定要使用BFS,但是为了练习,还是使用了) #include"iostream" #include"vector" #include"queue" #include"stack" using namespace std; struct node { int x; int y; int pre; }; int

洛谷P1605 迷宫

自作多情 提交于 2019-11-28 03:46:53
#include<iostream>// #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<string> using namespace std; int dx[4]={-1,1,0,0};//分别为向左,右,下,上走的时候x的变化量 int dy[4]={0,0,-1,1}; int N,M,T;//分别是迷宫的长,宽,障碍物的个数 int q[7][7]; int sx,sy,fx,fy;//(sx,sy)是迷宫的起点,(fx,fy)是迷宫的中点 int l,r;//障碍物的坐标 int sum = 0;//从起点到终点的方案数目 bool mark[7][7];//标记一个点是否走过 void dfs(int x, int y) { if(x==fx && y==fy) { sum++; return ; } else { //尝试的方法数 for(int i=0;i<4;i++) { //如果准备的走这个点没有走过并且不是障碍物 if(mark[x+dx[i]][y+dy[i]]==0 && q[x+dx[i]][y+dy[i]]==1) { mark[x][y]=1;//走过的地方打上标记 dfs(x+dx[i], y+dy[i]); mark[x][y]=0;/

Prim迷宫算法详解

核能气质少年 提交于 2019-11-27 19:15:07
不可预知性是所有事件之源头 ——某位哲学家 什么是Prim算法 可以吃吗 引入问题 小明家后面的公园准备开张啦!公园建筑方为了美观,准备修建一个 纯天然不添加 的迷宫。已知迷宫为15*15,四围除出入口外都围了墙(如下图) 迷宫 # E # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @ # # # # # # # # # # # # # # # 迷宫说明: #是墙 E是入口,@是出口 Q:现在请你生成一个随机的迷宫 Start your SHOW 问题求解 先给个 链接 自己体验一下Prim迷宫算法 的美丽 下面是关于Prim算法的解释 Prim迷宫算法的文本解释 English: 1.Start with a grid full of walls. 2.Pick a cell, mark it as part of the maze. Add the walls of the cell to the wall list. 3.While there are walls in the list: 1.Pick a random wall from the list. If only one of the two cells that the wall divides is

P1363 幻象迷宫[搜索]

余生颓废 提交于 2019-11-27 05:18:05
题目描述 (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫。) WD:呜呜,肿么办啊…… LHX:momo...我们一定能走出去的! WD:嗯,+U+U! 描述 Description 幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成。矩阵中有的地方是道路,用'.'表示;有的地方是墙,用'#'表示。LHX和WD所在的位置用'S'表示。也就是对于迷宫中的一个点(x,y),如果(x mod n,y mod m)是'.'或者'S',那么这个地方是道路;如果(x mod n,y mod m)是'#',那么这个地方是墙。LHX和WD可以向上下左右四个方向移动,当然不能移动到墙上。 请你告诉LHX和WD,它们能否走出幻象迷宫(如果它们能走到距离起点无限远处,就认为能走出去)。如果不能的话,LHX就只好启动城堡的毁灭程序了……当然不到万不得已,他不想这么做。。。 解析 显然,对于这样无限大的一个迷宫,由于其具有分形的特点,只要能从任意单位矩阵的一点的位置到达另一个单位矩阵的同一位置(相对本单位矩阵的位置),那么其它矩阵的这个点就可以到达,意味着能走出去。 貌似这题的数据不卡单位矩阵可走路径成环的情况,但是窝不知道窝想了好久。。。 对于另一种情况,且无环,如果我们走回到了某个曾经走过的点的位置(相对于无限的迷宫的位置),说明走不出去了。

数据结构实验之图论四:迷宫探索

心已入冬 提交于 2019-11-26 06:47:36
Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。 Output 若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。 访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。 Sample Input 1 6 8 1 1 2 2 3 3 4 4 5 5 6 6 4 3 6 1 5 Sample Output 1 2 3 4 5 6 5 4 3 2 1 Hint Source xam 解题思路:这道题其实就是对图进行一遍dfs,然后用一个数组来把dfs的顺序来存储起来。 代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[1011][1011] ; //记录节点之间的关系 int vis