• 用广度优先搜索解迷宫问题


    定义一个二维数组:

    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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。程序如下:

    //By LYLtim
    
    #include<stdio.h>
    #include<stdlib.h>
    
    const char
    	Di[4] = {0,1,0,-1},
    	Dj[4] = {1,0,-1,0};
    
    char maze[5][5] = {
    	2, 1, 0, 0, 0,
    	0, 1, 0, 1, 0,
    	0, 0, 0, 0, 0,
    	0, 1, 1, 1, 0,
    	0, 0, 0, 1, 0},
    	head = 0, tail = 1;
    
    struct {char i, j;} que[23];
    
    void print_maze(void)
    {
    	char i, j;
    	for (i = 0; i < 5; i++) {
    		for (j = 0; j < 5; j++)
    			printf("%hd ", maze[i][j]);
    		putchar('\n');
    	}
    	printf("*********\n");
    }
    
    int main(void)
    {
    	while (head != tail) {
    		head = (head + 1) % 23;
    		char i;
    		for (i = 0; i < 4; i++) {
    			char Ni = que[head].i + Di[i], Nj = que[head].j + Dj[i];
    			if (Ni >= 0 && Ni < 5 && Nj >= 0 && Nj < 5 && maze[Ni][Nj] == 0) {
    					que[tail = (tail + 1) % 23].i = Ni;
    					que[tail].j = Nj;
    					maze[Ni][Nj] = 2;
    					if (Ni == 4 && Nj == 4) {
    						printf("Have path.\n"); exit(0);
    					}
    			}
    		}
    		print_maze();
    	}
    	printf("No path.\n");
    	return 0;
    }

    运行结果如下:

    2 1 0 0 0 
    2 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0
    *********
    2 1 0 0 0
    2 1 0 1 0
    2 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0
    *********
    2 1 0 0 0
    2 1 0 1 0
    2 2 0 0 0
    2 1 1 1 0
    0 0 0 1 0
    *********
    2 1 0 0 0
    2 1 0 1 0
    2 2 2 0 0
    2 1 1 1 0
    0 0 0 1 0
    *********
    2 1 0 0 0
    2 1 0 1 0
    2 2 2 0 0
    2 1 1 1 0
    2 0 0 1 0
    *********
    2 1 0 0 0
    2 1 2 1 0
    2 2 2 2 0
    2 1 1 1 0
    2 0 0 1 0
    *********
    2 1 0 0 0
    2 1 2 1 0
    2 2 2 2 0
    2 1 1 1 0
    2 2 0 1 0
    *********
    2 1 0 0 0
    2 1 2 1 0
    2 2 2 2 2
    2 1 1 1 0
    2 2 0 1 0
    *********
    2 1 2 0 0
    2 1 2 1 0
    2 2 2 2 2
    2 1 1 1 0
    2 2 0 1 0
    *********
    2 1 2 0 0
    2 1 2 1 0
    2 2 2 2 2
    2 1 1 1 0
    2 2 2 1 0
    *********
    2 1 2 0 0
    2 1 2 1 2
    2 2 2 2 2
    2 1 1 1 2
    2 2 2 1 0
    *********
    2 1 2 2 0
    2 1 2 1 2
    2 2 2 2 2
    2 1 1 1 2
    2 2 2 1 0
    *********
    2 1 2 2 0
    2 1 2 1 2
    2 2 2 2 2
    2 1 1 1 2
    2 2 2 1 0
    *********
    Have path.
  • 相关阅读:
    使用正则表达式验证密码长度
    创建字符串
    洛谷P1605 迷宫 深度搜索 模板!
    洛谷P5534 【XR-3】等差数列 耻辱!!!
    搜索字母a或A
    洛谷P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
    19新生赛 质数中的质数
    洛谷P1055 ISBN号码
    洛谷P 1427 小鱼的数字游戏
    洛谷p1047 校门外的树
  • 原文地址:https://www.cnblogs.com/LYLtim/p/2220655.html
Copyright © 2020-2023  润新知