c顺序栈 -实现迷宫

第一次写迷宫记录一下哈  以下是全部程序没有将每个步骤分成单个方法

 

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define M 8
#define N 8

int mg[N + 2][M + 2] = {  {1,2,1,1,1,1,1,1,1,1},
                          {1,0,0,1,0,0,0,1,0,1},
                          {1,1,0,1,0,0,0,1,0,1},
                          {1,0,0,0,0,1,1,0,0,1},
                          {1,0,1,1,0,0,0,0,1,1},
                          {1,0,0,0,1,1,1,0,0,1},
                          {1,0,1,0,1,0,1,1,0,1},
                          {1,0,1,1,1,0,1,1,0,1},
                          {1,0,0,0,1,0,0,0,0,3},
                          {1,1,1,1,1,1,1,1,1,1} };
typedef struct {
    int x;
    int y;
    int di;
}box;
typedef struct {
    box data[MAXSIZE];
    int top;
}stack;


void Top(stack &st);
bool re(stack &st,int x, int y, int x2, int y2);

int main() {
    stack st;
    Top(st);
    if (!re(st,1, 1, M, N)) {
        printf("无解");
    }    
    cout <<endl<<"其路线图如下:↓"<<endl<<endl;
    for (int i = 0; i < M + 2; i++) {
        for (int j = 0; j < N + 2; j++) {
            if (mg[i][j] == 2) printf("↓");
            else if (mg[i][j] == 3) printf("→");
            else if (mg[i][j] == 1) printf("■");
            else if (mg[i][j] == -1) printf("√");
            else printf("  ");
        }
        printf("\n");
    }
}
void Top(stack& st) {
    st.top = -1;
}

bool re(stack &st,int x, int y, int x2, int y2) {
    int i, j, di, find;
    st.top = -1;
    st.top++;
    st.data[st.top].x = x;
    st.data[st.top].y = y;
    st.data[st.top].di = -1;
    while (st.top > -1) {
        find = 0;
        i = st.data[st.top].x;
        j = st.data[st.top].y;
        di = st.data[st.top].di;
        while (di < 4 && find == 0) {
            di++;
            switch (di) {
            case 0:i = st.data[st.top].x - 1; j = st.data[st.top].y; break;
            case 1:i = st.data[st.top].x; j = st.data[st.top].y + 1; break;
            case 2:i = st.data[st.top].x + 1; j = st.data[st.top].y; break;
            case 3:i = st.data[st.top].x; j = st.data[st.top].y - 1; break;
            }
            if (mg[i][j] == 0) find = 1;
        }
        if (find == 1) {
            st.data[st.top].di = di;
            st.top++;
            st.data[st.top].x = i;
            st.data[st.top].y = j;
            st.data[st.top].di = -1;
            mg[i][j] = -1;
            find = 0;
        }else {
            mg[st.data[st.top].x][st.data[st.top].y] = 0;
            st.top--;
        }
        if (i == x2&&j == y2) {

            printf("迷宫路径如下\n");
            for (int m = 0; m <= st.top; m++) {
                printf("(%d:%d)\t",st.data[m].x,st.data[m].y);
                if ((m + 1) % 4 == 0)  printf("\n");
            }
            printf("\n");
            return true;
        }
        
    }
        return false;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值