• 迷宫(栈)不能求最短路径



    #define _CRT_SECURE_NO_WARNINGS

    #include<stdio.h>
    #include <string.h>
    #include<math.h>
    #include<stdlib.h>

    char maze[100][100];
    int step[15][15];
    int n, m;
    int sm,sn,em,en;
    int dn[4]={ 0, 1, 0, -1 };
    int dm[4]={ 1, 0, -1, 0 };


    struct stack{
        int data[100];
        int top;
    };

    struct stack S;

    void push(int a)      //入栈
    {
        S.data[S.top] = a;
        S.top++;
    }
    int  pop()                //出栈
    {
        S.top--;
        return S.data[S.top];
    }
    int empty()                //检查栈是否为空
    {
        if (S.top == 0)
            return 0;
        else
            return 1;
    }


    int search_next(int now_m,int now_n)
    {
        int next_m=now_m, next_n=now_n;
        for (int i = 0; i < 4; i++)
        {
            next_m = now_m;
            next_n = now_n;
            next_m += dm[i];
            next_n += dn[i];
            if (next_m>=m || next_m<0 || next_n>=n || next_n < 0 || step[next_m][next_n] == 1 || maze[next_m][next_n] == '#')
                continue;
            else{
                return next_m*n + next_n;
            }        
        }
        return 0;
    }
    void maze_path()
    {
        int now_m=0, now_n=0,e=0;
        now_m = sm;
        now_n = sn;
        do{
            if (e=search_next(now_m, now_n)){
                push(now_m*n + now_n);
                step[now_m][now_n] = 1;
                if (now_m == em && now_n == en)
                    return;
                now_m = e / n;
                now_n = e%n;
                step[now_m][now_n] = 1;
            }

            else
            {
                e = pop();
                now_m = e / m;
                now_n = e%n;
            
                if (e = search_next(now_m, now_n))
                {
                    push(now_m*n + now_n);
                    now_m = e / m;
                    now_n = e % n;
                    step[now_m][now_n] = 1;
                }            
            }
        }while(!(now_m==em && now_n==en));
    }
    void print_path()
    {
        int count=1;
        for (int i = 0; i < S.top; i++){
            printf("<%d,%d>  ", S.data[i] / n, S.data[i] % n);
            count++;
        }
        
        printf("<%d,%d> ", em, en);
        printf("走出迷宫需要%d步 ", count);
        
    }
    int    main()    
    {
        int i, j;
        
        printf("请输入迷宫行数: ");
        scanf("%d", &m);
        printf("请输入迷宫列数: ");
        scanf("%d", &n);
        printf("S表示起点,E表示终点,#表示路障,=表示通路");
        printf("请输入迷宫: ");
        for (i = 0; i < m; i++)
            scanf("%s", maze[i]);

        for (i = 0; i < m; i++){
            for (j = 0; j < n; j++){
                if (maze[i][j] == 'S')
                {
                    sm = i; sn = j;
                }
                else if (maze[i][j] == 'E')
                {
                    em = i; en = j;
                }
            }
        }
        maze_path();
        print_path();

        system("pause");
        return 0;
    }
    /*   5行迷宫例子
    #S#=#
    ====#
    #=#=#
    #=#==
    ###=E
    */

    /*   4行迷宫例子
    S###
    ===E
    ####
    ####
    */

    /*
    S##
    =##
    E##
    */

  • 相关阅读:
    RocketMQ学习笔记(14)----RocketMQ的去重策略
    RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试
    RocketMQ学习笔记(12)----RocketMQ的Consumer API简介
    RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer
    RocketMQ学习笔记(10)----RocketMQ的Producer 事务消息使用
    RocketMQ学习笔记(9)----RocketMQ的Producer 顺序消息
    RocketMQ学习笔记(8)----RocketMQ的Producer API简介
    RocketMQ学习笔记(7)----RocketMQ的整体架构
    RocketMQ学习笔记(6)----RocketMQ的Client的使用 Producer/Consumer
    RocketMQ学习笔记(5)----RocketMQ监控平台rocketmq-console-ng的搭建
  • 原文地址:https://www.cnblogs.com/da-peng/p/4935916.html
Copyright © 2020-2023  润新知