zoukankan      html  css  js  c++  java
  • 栈的应用迷宫

    根据数据结构书本上的为代码实现的

    View Code
    #include<stdio.h>
    #include <windows.h>
    #include <stdlib.h>
    #define MAX_STACK_SIZE 100
    #define EXIT_ROW 9
    #define EXIT_COL 9
    
    
    int maze[10][10] = {
            {1,0,1,1,1,1,1,1,1,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,0,0,1,1,0,0,1},
            {1,0,1,1,1,0,0,0,0,1},
            {1,0,0,0,1,0,0,0,0,1},
            {1,0,1,0,0,0,1,0,0,1},
            {1,0,1,1,1,1,1,1,0,1},
            {1,1,0,0,0,0,0,0,0,1},
            {1,1,1,1,1,1,1,1,0,1}};/*初始化迷宫*/
    
    int mark[10][10] = {0};/*初始化标志位,0代表没走过,1代表走过*/
    
    bool mars[10][10] = {0};
    
    
    /*方向*/
    typedef struct{
        short int vert;
        short int horiz;
    }offsets;
    
    offsets move[4] = {{0,1},{1,0},{0,-1},{-1,0}};/*北,东,南,西*/
    
    
    /*迷宫类型*/
    typedef struct {
        short int row;
        short int col;
        short int dir;
    }element;
    
    element stack[MAX_STACK_SIZE];
    
    
    void path(void);
    element Delete(int* top);
    void add(int* top,element item);
    
    
    element Delete(int* top)/*出栈,top指向栈顶元素*/
    {
        if(*top == -1)
        {
            printf("stack is empty!\n");
        }
        return stack[(*top)--];
    }
    
    
    void add(int* top,element item)/*入栈*/
    {
        if(*top >= MAX_STACK_SIZE - 1)
        {
            printf("stack is full!\n");
            return;
        }
        stack[++*top] = item;
    }
    
    void PrintMap()
    {
       // printf("显示地图,1表示墙,0表示能通过的路径\n");
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                if(mars[i][j] == 1)
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED);
                printf("%d ",maze[i][j]);
                 if(mars[i][j] == 1)
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            }
            printf("\n");
        }
    }
    
    
    
    void path(void)/*迷宫函数*/
    {
        element position;
        int i,row,col,next_row,next_col,dir,top;
        bool found = 0;
        mark[1][1] = 1,top = 0;/*初始化标志数组元素以及栈*/
        stack[0].row = 1,stack[0].col = 1,stack[0].dir = 0; //入口的位置
        while(top > -1 && !found)
        {
            position = Delete(&top);    /*将栈顶元素取出,*/
            row = position.row;            /*利用中间变量row,col,dir等候判断*/
            col = position.col;
            dir = position.dir;
            while(dir < 4 && !found)
            {
                next_row = row + move[dir].vert;
                next_col = col + move[dir].horiz;
                if(next_row == EXIT_ROW && next_col == EXIT_COL)
                    found = 1;
                else if(!maze[next_row][next_col] && !mark[next_row][next_col])/*判断下一步可走并且没走过,则入栈*/
                {
                    mark[next_row][next_col] = 1;
                    position.row = row;
                    position.col = col;
                    position.dir = ++dir;
                    add(&top,position);/*合理则入栈*/
                    row = next_row;/*继续向下走*/
                    col = next_col;dir = 0;
                }
                else
                    dir++;/*走不动了就换一个方向,dir<4时,改变方向*/
            }
            if(found)/*判断是否有出口*/
            {
                for(i = 0;i <= top;++i)
                     mars[stack[i].row][stack[i].col] = 1;
                mars[row][col] = 1;
                mars[0][1] = 1;
               // mars[EXIT_ROW][EXIT_COL] = 1;
               // system("color 07");
               printf("\n\n找到出口了,红色代表路径\n");
                PrintMap();
            }
        }
        if(!found)
        {
            printf("找不到出口\n");
        }
    }
    
    
    int main(void)
    {
        PrintMap();
        path();
        return 0;
    }
  • 相关阅读:
    第150天:网页中插入百度地图方法(需要密钥)
    第149天:javascript中this的指向详解
    第148天:js+rem动态计算font-size的大小,适配各种手机设备
    第147天:web前端开发中的各种居中总结
    第146天:移动H5前端性能优化
    第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片
    第144天:PS切图方法总结
    第143天:渐进增强和优雅降级之间的不同
    第142天:Size Marks下载安装和使用方法
    第141天:前端开发中浏览器兼容性问题总结(二)
  • 原文地址:https://www.cnblogs.com/genslow/p/2417276.html
Copyright © 2011-2022 走看看