迷宫

使用递归和回溯法实现迷宫问题

空扰寡人 提交于 2020-02-12 22:03:16
package recursion; /** * 迷宫采用递归做法 * * @author JustGeeker * */ public class Maze { public static void main(String[] args) { Maze maze = new Maze(); int[][] arr = maze.getMap(8, 8); maze.showMap(arr); System.out.println("==================="); maze.setWay(arr, 1, 1); maze.showMap(arr); } /** * 0 表示没走过,1表示围墙,2表示可用走通,3表示可用走过但是是死路 * * @param len数组长度 * @param wid数组宽度 * @return */ public int[][] getMap(int len, int wid) { int[][] arr = new int[len][wid]; for (int i = 0; i < len; i++) { arr[i][0] = 1; arr[i][wid - 1] = 1; } for (int i = 0; i < wid; i++) { arr[0][i] = 1; arr[len - 1][i] = 1; } arr[2][1

输出迷宫的所有路径 dfs

半城伤御伤魂 提交于 2020-02-07 03:11:45
有一个n m格的迷宫(表示有n行、m列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这n m个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-l表示无路)。 第一行是两个数n,m( 1 < n , m < 15 ),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点 输入: 5 6 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 5 6 学深搜好累,自己写了一下 # include <iostream> # include <vector> using namespace std ; struct Point { int px ; int py ; } ; int maze [ 20 ] [ 20 ] ; int r , c ; int dic [ 4 ] [ 2 ] = { { 1 , 0 } , { 0 , - 1 } , { - 1 , 0 } , { 0 , 1 } } ; int sx , sy ; int fx , fy ; int ans ; bool vis [ 20 ] [ 20

迷宫回溯问题--java实现

[亡魂溺海] 提交于 2020-02-04 02:24:09
/*迷宫问题: * 若要找最短路径,可改变搜索顺序,最后计算2的个数 * 原先的地图 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 */ public class MiGong { public static void main ( String [ ] args ) { // TODO Auto-generated method stub //先创建一个二维数组,模拟迷宫 //地图 int [ ] [ ] map = new int [ 8 ] [ 7 ] ; //使用1表示墙 //上下全部置为1 for ( int i = 0 ; i < 7 ; i ++ ) { map [ 0 ] [ i ] = 1 ; map [ 7 ] [ i ] = 1 ; } //左右全部置为1 for ( int i = 0 ; i < 8 ; i ++ ) { map [ i ] [ 0 ] = 1 ; map [ i ] [ 6 ] = 1 ; } //设置挡板 1表示 map [ 3 ] [ 1 ] = 1 ; map [ 3 ] [ 2 ] = 1 ; //输出地图 System . out . println (

PTA-7-51 迷宫寻路 (20分)DFS

浪尽此生 提交于 2020-02-03 01:16:44
题目 给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行。在迷宫中只允许在水平或上下四个方向的通路上行走,走过的位置不能重复走。 5行8列的迷宫如下: 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 则从左上角(1,1)至右下角(5,8)的最短路径为: 1,1–》2,1–》2,2–》2,3–》3,3–》3,4–》3,5–》4,5–》5,5–》5,6–》5,7–》5,8 题目保证每个迷宫最多只有一条最短路径。 请输出该条最短路径,如果不存在任何通路,则输出"NO FOUND". 输入格式: 第一行,输入M和N值,表示迷宫行数和列数。 接着输入M行数值,其中,0表示通路,1表示障碍物。每列数值用空格符间隔。 接下来可能输入多组迷宫数据。 当输入M的值为-1时结束输入。 输出格式: 按行顺序输出路径的每个位置的行数和列数,如 x,y 如果不存在任何路径,则输出"NO FOUND". 每组迷宫寻路结果用换行符间隔。 输入样例: 8 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0

USACO / Overfencing(BFS)

大城市里の小女人 提交于 2020-01-31 19:16:19
Overfencing 穿越栅栏 Kolstad and Schrijvers 特别鸣谢lyl提供翻译! 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫: +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+ 如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。 格式 PROGRAM NAME : maze1 INPUT FORMAT : (file maze1.in) 第一行: W和H(用空格隔开) 第二行至第2 * H + 1行: 每行2 * W + 1个字符表示迷宫

【USACO 2.4.2】穿越栅栏

你。 提交于 2020-01-31 19:13:34
【描述】 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫: +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+ 如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。 【格式】 PROGRAM NAME : maze1 INPUT FORMAT : (file maze1.in) 第一行: W和H(用空格隔开) 第二行至第2 * H + 1行: 每行2 * W + 1个字符表示迷宫 OUTPUT FORMAT : (file maze1.out) 输出一个单独的整数

迷宫-dfs

久未见 提交于 2020-01-22 00:37:20
题目描述 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 1≤N,M≤5 输入 第一行起点坐标SX,SY,终点坐标FX,FY。 第二行N、M和T,N为行,M为列,T为障碍总数。 接下来T行,每行为障碍点的坐标。 输出 给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。 样例输入 1 1 2 2 2 2 1 1 2 样例输出 1 题解: 巨简单的DFS,模板题,数据也很小 #include <bits/stdc++.h> #define MAXN 20 using namespace std; int rub[MAXN][MAXN]; int vis[MAXN][MAXN]; int n, m, t, bx, by, ex, ey; int ans = 0; int zb[4][2] = {{0,-1},{0,1},{1,0},{-1,0}}; void dfs(int x,int y) { if(x == ex && y == ey) { ans++;return; } else for(int i = 0 ; i < 4; ++i) if(x >= 1 && x <= n

走迷宫(排列组合)

十年热恋 提交于 2020-01-21 23:41:22
问题描述 蒜头君从一个 n 行 m 列的迷宫的左上角走到右下角,蒜头君每次只能向下或者向右走一步,蒜头君想知道他有多少种走法。 输入格式 输入两个整数 n(2≤n≤10^5),m(2≤m≤10^5)。 输出格式 由于方案数太多,输出最后结果对 1000000007 取模的结果。 样例输入 2 3 样例输出 3 n行m列的迷宫,从左上角走到右下角,总共需走n+m-2步,其中n-1步是向下走的,m-1步是向右走的 那可能的走法就有C(n+m-2, n-1)种 表示成阶层运算就是 (n+m-2)! / (m-1)!*(n-1)! - 来源: https://www.cnblogs.com/jiamian/p/12227339.html

day 1 T1 迷宫

浪尽此生 提交于 2020-01-17 09:00:35
迷宫 【问题描述】 n*m 的迷宫, 迷宫中有 k 种钥匙, 每个格子有一个整数 x, 如果 x=0 说明可 以任意到达, |x|>k 代表不允许到达。 x>0 代表该位置有第 x 种钥匙, 捡起地上的 钥匙需要花费 1 步。 x<0 代表到达该位置需要第-x 种钥匙, 开门不需要时间, 问 从左上角走到右下角最少需要多少步? (数据保证左上角是 0) 【输入格式】 第一行三个正整数 n,m,k 接下来 n 行, 每行 m 个整数表示地图 【输出格式】 输出一个整数, 表示从左上角走到右下角最少需要多少步, 若不能到达输出-1. 【样例输入】 3 5 2 0 0 0 0 0 2 3 0 0 -1 3 1 -2 3 0 【样例输出】 14 【数据解释】 先拿到第 2 把钥匙, 然后再拿第 3 把钥匙 【数据规模与约定】 20% n,m<=10 k<=2 另 30% n,m<=1000 k=0 100% n,m<=1000 k<=5 代码及解析 #include<queue> #include<cstdio> #include<algorithm> #define N 1005 using namespace std; int n,m,k; int map[N][N]; struct node{int x,y,s,dis;}; queue<node>q; bool vis[N][N]

队列求解迷宫最短路径

跟風遠走 提交于 2020-01-12 05:35:38
#include <stdio.h> typedef struct {   int x;   int y;   int pre; }Queue; Queue Qu[1000]; int Map[20][20]; int front, rear; int M, N; int aim[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; void Print(int front) {   int j, k;   j = k = front;   j = front;   while(j != 0)   {     j = Qu[k].pre;     Qu[k].pre = -1;     k = j;   }   int ns = 0;   for (int i = 0; i <= front; i++)   {     if (Qu[i].pre == -1)     {       ns++;       printf("(%d, %d)", Qu[i].x, Qu[i].y);       if (ns % 5 == 0)       {         printf("\n");       }     }   } } void FindPath(int sx, int sy, int ex, int ey) {   front = rear