迷宫求解问题

题目描述

用一个m×n的矩阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对给定的迷宫,求出找到的第一条从入口到出口的通路,或得到没有通路的结论。

我们指定:

(1) 迷宫的入口为矩阵的左上角(1,1),迷宫的出口为右下角(m,n);

(2) 路径的探索顺序依次为"东南西北"(即:右下左上)。

输入

第一行输入两个整数,空格间隔,分别表示矩阵的行数m和列数n;

接下来的连续m行,输入迷宫矩阵的信息。

输出

求得的通路以三元组(i,j,d)的形式输出。

其中:

i,j指示迷宫的一个坐标;

d表示走到下一坐标的方向(数字1表示东,数字2表示南,数字3表示西,数字4表示北);

终点d值为0。

样例输入

9 8
00100010
00100010
00001101
01110010
00010000
01000101
01111001
11000101
11000000

样例输出

(1,1,1)(1,2,2)(2,2,2)(3,2,3)(3,1,2)(4,1,2)(5,1,1)(5,2,1)(5,3,2)(6,3,1)(6,4,1)(6,5,4)(5,5,1)(5,6,1)(5,7,2)(6,7,2)(7,7,2)(8,7,2)(9,7,1)(9,8,0)

代码

#include<stdlib.h>
#include<stdio.h>
 
typedef struct Stack
{
    int row;
    int col;
    int dir;
    struct Stack* next;
    struct Stack* top;
}stack;
 
stack* InitStack()
{
    stack* s = (stack*)malloc(sizeof(stack));
    s->next = NULL;
    s->top = NULL;
    return s;
}
 
void Input(stack** s, int r, int c, int d)
{
    stack* n = (stack*)malloc(sizeof(stack));
    n->next = NULL;
    n->row = r;
    n->col = c;
    n->dir = d;
    n->top = *s;
    (*s)->next = n;
    (*s) = n;
}
 
void Output(stack** s)
{
    if ((*s)->top == NULL)
    {
        printf("??");
        system("pause");
        exit(0);
    }
    stack* p = (*s);
    (*s) = (*s)->top;
    (*s)->next = NULL;
    free(p);
}
 
void FindWay(stack** s, char** board, int r, int c, int m, int n)
{
    if ((c + 1 < n) && (board[r][c + 1] == '0'))
    {
        (*s)->dir = 1;
        c = c + 1;
        board[r][c] = '*';
        Input(s, r, c, 0);
        if (((*s)->row == m - 1) && ((*s)->col == n - 1))
            return;
        else
        {
            FindWay(s, board, r, c, m, n);
            if (((*s)->row == m - 1) && ((*s)->col == n - 1))
                return;
            Output(s);
            r = (*s)->row;
            c = (*s)->col;
        }
    }
    if ((r + 1 < m) && (board[r + 1][c] == '0'))
    {
        (*s)->dir = 2;
        r = r + 1;
        board[r][c] = '*';
        Input(s, r, c, 0);
        if (((*s)->row == m - 1) && ((*s)->col == n - 1))
            return;
        else
        {
            FindWay(s, board, r, c, m, n);
            if (((*s)->row == m - 1) && ((*s)->col == n - 1))
                return;
            Output(s);
            r = (*s)->row;
            c = (*s)->col;
        }
    }
    if ((c - 1 > -1) && (board[r][c - 1] == '0'))
    {
        (*s)->dir = 3;
        c = c - 1;
        board[r][c] = '*';
        Input(s, r, c, 0);
        if (((*s)->row == m - 1) && ((*s)->col == n - 1))
            return;
        else
        {
            FindWay(s, board, r, c, m, n);
            if (((*s)->row == m - 1) && ((*s)->col == n - 1))
                return;
            Output(s);
            r = (*s)->row;
            c = (*s)->col;
        }
    }
    if ((r - 1 > -1) && (board[r - 1][c] == '0'))
    {
        (*s)->dir = 4;
        r = r - 1;
        board[r][c] = '*';
        Input(s, r, c, 0);
        if (((*s)->row == m - 1) && ((*s)->col == n - 1))
            return;
        else
        {
            FindWay(s, board, r, c, m, n);
            if (((*s)->row == m - 1) && ((*s)->col == n - 1))
                return;
            Output(s);
            r = (*s)->row;
            c = (*s)->col;
        }
    }
}
 
int main()
{
    stack* s;
    stack* head;
 
    int m = 0;
    int n = 0;
 
    int i = 0;
 
    int r = 0;
    int c = 0;
 
    scanf("%d%d", &m, &n);
    char **board = (char**)malloc(m * sizeof(char*));
    for (i = 0; i < m; i++)
    {
        board[i] = (char*)malloc(n * sizeof(char));
        scanf("%s", board[i]);
    }
    board[0][0] = '*';
 
    s = InitStack();
    head = s;
    Input(&s, 0, 0, 0);
    FindWay(&s, board, r, c, m, n);
 
    head = head->next;
    while (head != NULL)
    {
        printf("(%d,%d,%d)", head->row + 1, head->col + 1, head->dir);
        head = head->next;
    }
    return 0;
}
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值