迷宫

c语言-老鼠走迷宫逐步理解

社会主义新天地 提交于 2020-03-18 17:05:37
c语言实现老鼠走迷宫 在没有智能手机的时代,不少人玩游戏会玩老鼠走迷宫这样的闯关游戏。每一关有着不同的地图场景,可能还会充斥着各种障碍。 老鼠走迷宫是经典的递回求解的算法题 我们用二维数组表示迷宫场景。其中用2代表迷宫的墙壁,0代表可行通道。 我们用7*7的二维数组具体实现,假定我们设置[1][1]是迷宫入口,[5][5]是迷宫出口。 #define M 7 int maze[M][M] = { {2,2,2,2,2,2,2}, {2,0,0,0,0,0,2}, {2,0,2,0,2,0,2}, {2,0,0,2,0,2,2}, {2,2,0,2,0,2,2}, {2,0,0,0,0,0,2}, {2,2,2,2,2,2,2} }; int start1=1,start2=1; int end1=5,end2=5; int main () { int i,j; printf("显示迷宫:\n"); for(i=0;i<M;i++) //对摆放的数组迷宫进行打印 { for(j=0;j<M;j++) if(maze[i][j] == 2) printf("◾"); else printf(" "); printf("\n"); } } 这样我们的迷宫绘制基本完成。下面我们对老鼠可能行走的路径进行分析输出。 我们定义一个visit函数,对老鼠行走方向进行逻辑分析

【递归】走迷宫

[亡魂溺海] 提交于 2020-03-17 14:40:23
走迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 判断是否能从迷宫的入口到达出口 输入: 先输入两个整数表示迷宫的行数m和列数n,再输入口和出口的坐标,最后分m行输入迷宫,其中1表示墙,0表示空格每个数字之间都有空格。 输出: 若能到达,则输出"Yes",否则输出"No",结果占一行。 输入样例: 3 3 0 0 2 2 0 0 0 1 1 0 0 1 0 输出样例: Yes 1 #include <stdio.h> 2 #include <stdlib.h> 3 int a[10000][10000],h,l; 4 void search(int i,int j) 5 { 6 if(a[i][j]==0) 7 { 8 a[i][j]=2; 9 if(j-1>=0) 10 search(i,j-1); 11 if(i+1<h) 12 search(i+1,j); 13 if(j+1<l) 14 search(i,j+1); 15 if(i-1>=0) 16 search(i-1,j); 17 } 18 } 19 int main() 20 { 21 scanf("%d %d",&h,&l); 22 int i,j,m,n; 23 scanf("%d %d",&i,&j); 24 scanf("%d %d",&m,&n); 25 int t,b; 26

POJ 3984 迷宫问题

☆樱花仙子☆ 提交于 2020-03-16 01:59:17
来源: http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8154 Accepted: 4804 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) Source 题意:略 题解: 非常基础的题,没有挖坑。 三种方法解决之 1.递归DFS+回溯 2.非递归DFS+回溯 3.BFS //前两种方法均是先将全部路径求出再找出最短路径

迷宫问题pascal程序

有些话、适合烂在心里 提交于 2020-03-14 12:04:15
Description 设有一个n×n的方格迷宫,入口和出口分别在左上角和右上角(如图的示) 迷宫的格子分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下图所示。 即从某点出发,可沿8个方向前进,前进方格中的数为0时表示可以通过,为1时表示不可以通过,如从入口开始,有2条路可以走,即向右走,或向右下角走,当迷宫给出后,找出一条从入口(1,1)到出口(1,8)的有多少条不同的中路径。 Input Output Sample Input 8 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 Sample Output 720 这题我是用搜索来做的 搜的时候,能走八个方向,如果下一个点能走就记录下来,继续搜。 var n,x,y,s,t,i,j:longint; a:array[0..1001,0..1001]of longint; b:array[0..1001]of longint; dx:array[1..8]of longint=(0,0,1,1,1,-1,-1,-1); dy:array[1..8]of longint=(1,-1,0,1,-1,0,1,-1);

迷宫回溯问题

ⅰ亾dé卋堺 提交于 2020-03-12 14:37:19
如上,黑色为障碍物,从青色到红色 代码+注释: package recursion; public class MiGong { public static void main(String[] args) { //先创建一个二维数组,模拟地图 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; } //设置挡板 map[3][1] = 1; map[3][2] = 1; //迷宫寻找 setWay(map, 1, 1); //输出地图,小球走过,并标识地图路线 for(int i=0;i<8;i++) { for(int j=0;j<7;j++) { System.out.print(map[i][j] + " "); } System.out.println(); } } /** * * @param map 表示地图 * @param i 开始位置 * @param j * @return 如果找到返回true,否则返回false */ public static

迷宫最短路问题

杀马特。学长 韩版系。学妹 提交于 2020-03-05 17:22:30
迷宫最短路问题 题意:从迷宫左上角到左下角,求最短路 输入:迷宫的横纵坐标和迷宫元素 输出:迷宫最短路所经过的坐标 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <string> using namespace std; int dx[] = {1,1,0,-1,-1,-1,0,1}; int dy[] = {0,-1,-1,-1,0,1,1,1}; int n, m; int ** maze; bool ** vis; struct node { int x, y; string record; node(int a, int b,string s):x(a),y(b) { record = s; } node() { x = y = 0; } }; queue<node> qu; string BFS() { node cur; string nex; int c,r; //记录路径 cur.x = 1,cur.y = 1; cur.record = "(1,1)\n"; qu.push(cur); vis[1][1] = 1; while(!qu.empty()) { cur = qu.front(); qu.pop(); /

1167. 迷宫

丶灬走出姿态 提交于 2020-03-04 07:48:02
1167. 迷宫 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 题目描述 设有一个N*N(2<=N<10)方格的迷宫,入口分别在左上角和右上角。迷宫格子中分别放0和1,0表示可通,1,表示不能通过,入口和出口肯定是0。迷宫走的规则如下:即从某个点开始,又八个方向可走,前进方格中的数字为0时表示可以通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。 输入 第一行输入N. 接下来N行,每行N个数字,0或1,描述迷宫。 输出 输出路径总数。 样例输入 3 0 0 0 0 1 1 1 0 0 样例输出 2 数据范围限制 2<=N<10 1 #include<iostream> 2 using namespace std; 3 int xx[9]={0,0,1,1,1,-1,-1,-1}; 4 int yy[9]={1,-1,1,0,-1,1,0,-1}; 5 int tot; 6 int n; 7 int a[101][101]; 8 int vis[101][101]; 9 void f(int x,int y) 10 { 11 if(x==1&&y==n) 12 { 13 tot++; 14 return; 15 } 16 else 17 { 18

POJ - 3984 迷宫问题 BFS求具体路径坐标

穿精又带淫゛_ 提交于 2020-03-02 06:03:08
迷宫问题 定义一个二维数组: 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) //update:2019蓝桥杯原题变式 BFS经典题。需要在结构体中定义c记录当前下标,用f记录父节点下标。输出路径时由叶节点遍历到根节点,逆序输出。 #include<stdio.h> #include<queue> using namespace std; int a[10][10],b[10][10],rx[30],ry[30]; int t[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; struct

第十届蓝桥杯E题 BFS解决

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-28 12:46:48
19蓝桥杯E题 迷宫 【问题描述】 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。 010000 000100 001001 110000 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。 输入 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 01000000001010100011010000101000001010101011001011 00011111000000101000010010100010100000101100000000

迷宫大门(door)

浪子不回头ぞ 提交于 2020-02-28 03:18:39
迷宫大门(door) 在跳棋游戏大获全胜后,小明就开始一个人在校园里溜达了。突然他在校园角落里发现了一面神奇的墙壁,墙壁上有一排钉子,每个钉子上都挂着一根两端系有小球的绳子,如下图所示: 小明可以调整每一根绳子在钉子左右两端的长度,当来自不同绳子的相邻小球高度一样时(具体可见样例说明),便可获得积分1分。当小明的方案获得最高积分时,迷宫大门就会开启,小明就可以进去寻找宝藏啦! 这是第四题?既然如此的水,一个贪心就解决了! 可以不知道为什么比赛时只有11.7分。 进过大佬的讲解,我终于大悟! 题目思路,这道题我们可以用贪心来做(人人都知道,可我竟然没有对),我们一开始我们用一个数组来记录每一颗钉子的可调动的长度。然后做一遍贪心就行了 code: # include <cstdio> # include <iostream> using namespace std ; int a [ 500010 ] ; int main ( ) { freopen ( "door.in" , "r" , stdin ) ; freopen ( "door.out" , "w" , stdout ) ; int n , u , c , ans = 0 ; cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) { cin >> u >> c ; a [ i ] = u