J - 迷宫问题

J - 迷宫问题

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status

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)

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4
 5 int map[5][5];
 6 int ans[5][5];
 7 int num=99999;
 8
 9 void read_map()
10 {
11     memset(map,0,25*sizeof(int));
12     memset(ans,0,25*sizeof(int));
13     for (int i=0;i<5;i++)
14     {
15         for (int j=0;j<5;j++)
16         {
17             cin>>map[i][j];
18         }
19     }
20 }
21
22 void copy_map()
23 {
24     for (int i=0;i<5;i++)
25     {
26         for (int j=0;j<5;j++)
27         {
28             ans[i][j]=map[i][j];
29         }
30     }
31 }
32
33 void find_way(int x,int y,int all)
34 {
35     map[x][y]=2;
36     if (x==4&&y==4&&all<=num)
37     {
38         copy_map();//复制到ans里去;
39         num=all;
40         map[x][y]=0;
41     }
42     else
43     {
44         if (x+1<5&&map[x+1][y]==0) find_way(x+1,y,all+1);
45         if (y+1<5&&map[x][y+1]==0) find_way(x,y+1,all+1);
46         if (x-1>-1&&map[x-1][y]==0) find_way(x-1,y,all+1);
47         if (y-1>-1&&map[x][y-1]==0) find_way(x,y-1,all+1);
48         map[x][y]=0;
49     }
50 }
51
52 void show_ans(int x,int y)
53 {
54     ans[x][y]=0;
55     if (x==4&&y==4)
56     {
57         cout<<"("<<x<<", "<<y<<")"<<endl;
58         return;
59     }
60     else
61     {
62         if (x+1<5&&ans[x+1][y]==2)
63         {
64             cout<<"("<<x<<", "<<y<<")"<<endl;
65             show_ans(x+1,y);
66         }
67         if (y+1<5&&ans[x][y+1]==2)
68         {
69             cout<<"("<<x<<", "<<y<<")"<<endl;
70             show_ans(x,y+1);
71         }
72         if (x-1>-1&&ans[x-1][y]==2)
73         {
74             cout<<"("<<x<<", "<<y<<")"<<endl;
75             show_ans(x-1,y);
76         }
77         if (y-1>-1&&ans[x][y-1]==2)
78         {
79             cout<<"("<<x<<", "<<y<<")"<<endl;
80             show_ans(x,y-1);
81         }
82     }
83 }
84
85 int main()
86 {
87     read_map();
88     find_way(0,0,0);
89     show_ans(0,0);
90     return 0;
91 }

 
时间: 2024-08-27 02:42:17

J - 迷宫问题的相关文章

2016HUAS暑假集训题1 J - 迷宫问题

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 左上角到右下角的最短路径,格式如样例所示. Sa

迷宫实现递归版本C++

迷宫实现递归版本C++ 问题描述: //////////////////////////////////////////////////////////////题目:迷宫求解问题. 大致思路: //1.入口,出口判断/程序终止判定:4个方位的坐标边界比较,表明到了出入口.//2-1.求解原理1:暴力处理,从入口点开始,对其四个方向进行可行性判别,获取下一位置,重复,知道走到出口.//2-2.求解原理2:对于有出口的迷宫,如果你一直靠右,或者靠左行走,必然能够走到出口.这个方案省去了1中暴力队每个

Java迷宫代码,深度优先遍历

此次迷宫深度优先遍历寻找路径采用栈结构,每个节点都有固定的行走方向(右下左上),除非一个方向走不通,不然会一条道走到黑. 如果路径存在,打印出行走路径,否则打印出迷宫不存在有效路径. 方向常量定义: public interface Constant { // 右方向 int RIGHT = 0; // 下方向 int DOWN = 1; // 左方向 int LEFT = 2; // 上方向 int UP = 3; } 所用到的栈定义(jdk自带的栈或集合也可以实现此功能) /** * 描述:

洛谷——P1141 01迷宫

https://www.luogu.org/problem/show?pid=1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整

NYOJ306 走迷宫(dfs+二分搜索)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路

迷宫探索

/* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 */ #include<iostream> using namespace std; struct node { int x;//横坐标 int y;//纵坐标 int f;//父亲在队列中的编号 int s;//步数 }; int main() { node que[2051]; int a[51][51]={0}; int book[51][51]={0}; //定义一个用于表示走

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using

P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

深度优先搜索(迷宫救人最短路径)

1 import java.util.Scanner; 2 3 public class One { 4 //n,m为迷宫的行列范围,p,q是某人迷路所在地点,min用于记录走到终点最小路径的步数 5 public static int n,m,p,q,min=9999; 6 //数组a是迷宫,1代表有障碍物,数组d用于移动方向(右.下.左.上),数组book用于标记当前位置是否在路径中 7 public static int a[][]=new int[51][51],book[][]=new