迷官找出口

要求:
利用栈实现
说明:0为墙,1为路
举例:
4X4的一个迷官
1 0 0 0
0 1 1 0
0 0 0 1
1 1 1 1
入口(1,1) 出口(4,1)
输出路径:
(1,1)->(2,2)->(2,3)->(3,4)->(4,4)->(4,3)->(4,2)->(4,1)
否则输出未找到此路。
坐标系
坐示系
main.h

#ifndef main_h__
#define main_h__

#include <stdio.h>
#include "stack.h"
typedef struct move_def{
    int y;
    int x;
}Move;
void printout(stack s);
void process();
void initMap(int m, int n);
#endif // main_h__

main.c

#include "main.h"
int map[256][256];

int main(){
    process();
    return 0;
}

void printout(stack s){
    stack s_t;
    ElementType t;
    if (isEmpty(s)){
        puts("未找到相应路径.");
        return;
    }
    initStack(&s_t, s.sz);
    while (!isEmpty(s)){
        t = getTop(s);
        Push(&s_t, t);
        Pop(&s);
    }

    while (!isEmpty(s_t)){
        t = getTop(s_t);
        printf("(%d,%d)", t.x, t.y);
        Pop(&s_t);
        if (!isEmpty(s_t))
            printf("->");
    }
    printf("
");
    Destory(&s_t);
}

void initMap(int m, int n){
    // m 高度 n 宽度
    int i, j;
    for (i=0; i<m ;i++)
        for (j=0; j<n; j++){
            // 边缘置0
            if (j==0 || j == n-1 || i==0 || i== m-1){
                map[i][j] = 0;
                continue;
            }
            scanf("%d", &map[i][j]);
        }
}

void process(){
    Move move[8] = {
        {0,-1}, // 上
        {1,-1}, // 右上
        {1 ,0}, // 右
        {1,1},  // 右下
        {0 ,1}, // 下
        {-1,1}, // 左下
        {-1,0}, // 左
        {-1,-1} // 上
    };
    int i, j;               // 下次欲寻找的位置
    int start_x, start_y;  // 出口的位置
    int end_x, end_y;      // 结束的位置
    int flag = 0;          //找到出口  1 未找到出口 0
    int m, n;              // 高度 m 宽度 n
    stack s;
    ElementType t;
    // 迷官数据初始化
    printf("输入迷官高度m与宽度n:");
    scanf("%d%d", &m, &n);
    if (m+2 >256 || m < 0 || n+2>256 || n < 0){
        printf("对不起,您输入的数据有误!大小均在256之内!");
        exit(1);
    }
    // 左右 上下各加一行
    m += 2;
    n += 2;
    initMap(m, n);

    printf("请输入起点坐标x,y:");
    scanf("%d%d", &t.x, &t.y);
    t.d = 0;
    if (t.x<0 || t.x>n || t.y<0 || t.y> m){
        printf("对不起,您输入的数据有误!");
        exit(1);
    }

    printf("请输入出口位置x, y:");
    scanf("%d%d", &end_x, &end_y);
    if (end_x<0 || end_x>n || end_y<0 || end_y> m){
        printf("对不起,您输入的数据有误!");
        exit(1);
    }
    start_x = t.x; start_y = t.y;
    initStack(&s, m*n);
    Push(&s, t);
    while (!flag){
        t = getTop(s);
        map[t.x][t.y] = -1;
        while (t.d < 8){
            i = t.x + move[t.d].x;
            j = t.y + move[t.d].y;

            // 找到出口
            if (i == end_x && j == end_y){
                t.x = i; t.y = j; t.d = 0;
                Push(&s, t);
                flag = 1; break;
            }

            // 未找到出口
            if (map[i][j] == 1){
                t.x = i; t.y = j;t.d=0;
                Push(&s,t);
                break;
            }
            t.d++;
        }
        if (t.d == 8) {
            if (t.x == start_x && t.y == start_y)
                flag = 1;
            Pop(&s);
        }
    }
    printout(s);
    Destory(&s);
}

stack.h

#ifndef stack_h__
#define stack_h__

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef enum boolean {FALSE, TRUE} BOOL;

typedef struct ElementType_def{
    int x;
    int y;
    int d;
}ElementType;

typedef struct stack_def{
    ElementType* data;
    int top;
    int sz;
}stack;
void initStack(stack* s, int sz);
BOOL isEmpty(stack s);
BOOL isFull(stack s);
void Pop(stack *s);
void Push(stack* s, ElementType e);
ElementType getTop(stack s);
void Destory(stack* s);
#endif // stack_h__

stack.c

#include "stack.h"

void initStack(stack* s, int sz){
    if (sz < 0){
        puts("error:sz < 0");
        exit(1);
    }
    s->sz = sz;
    s->data = (ElementType*)malloc(sizeof(ElementType)*s->sz);
    s->top = -1;
}

BOOL isEmpty(stack s){
    return (BOOL)(s.top==-1);
}

BOOL isFull(stack s){
    return (BOOL)(s.top == s.sz);
}


void Pop(stack *s){
    if (isEmpty(*s)){
        puts("error: Pop stack is empty.");
        exit(1);
    }
    s->top--;
}

void Push(stack* s, ElementType e){
    if (isFull(*s)){
        puts("error: Push stack is Full.");
        exit(1);
    }
    s->data[++s->top] = e;
}

ElementType getTop(stack s){
    if (isEmpty(s)){
        puts("error: getTop stack is  empty.");
        exit(1);
    }
    return s.data[s.top];
}

void Destory(stack* s){
    free(s->data);
}

运行图1
运行图2

原文地址:https://www.cnblogs.com/laohaozi/p/12538388.html