走出迷宫功能【误】

打完区域赛之后好久没做题了,按理来说这样是不行的,但是因为区域赛战绩太烂,也和周围的人发生了一些事情,所以并没有心情做。。。

 

这博文的主要内容是因为我没带优盘在机房写了个小作业,发在这好带走。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

char maps[1000][1000];
bool vis[1000][1000];
int step[2][4] = {{1, 0, -1, 0}, {0, 1, 0, -1}};
int n, m;
int top;
int end_x, end_y;
struct node
{
    int x, y;
};
struct node stk[1000000 + 5];

bool confirm(int x, int y)
{
    if (x < 0 || x >= n || y < 0 || y >= m)
        return false;
    return true;
}

bool flag;
void solve(int x, int y)
{
    int i;
    if (maps[x][y] == 'E')
    {
        struct node tmp;
        tmp.x = m - x;
        tmp.y = y;
        stk[top] = tmp;
        flag = true;
        return;
    }
    for (i = 0; i < 4; ++i)
    {
        if (confirm(x + step[0][i], y + step[1][i]) && !vis[x + step[0][i]][y + step[1][i]] && maps[x + step[0][i]][y + step[1][i]] != '*')
        {
            vis[x][y] = true;
            struct node tmp;
            tmp.x = m - (x + step[0][i]);
            tmp.y = (y + step[1][i]);
            stk[top++] = tmp;
            solve(x + step[0][i], y + step[1][i]);
            if (flag)
                return;
            top--;
        }
    }
    return;
}

int main()
{
    char ch;
    int i, j;
    int start_x, start_y;
    printf("Would you want to solve a maze? <y/n>: ");
    while (1)
    {
        scanf("%c", &ch);
        if (ch == 'n')
            break;
        else if (ch == 'y')
        {
            memset(maps, '\0', sizeof(maps));
            memset(vis, false, sizeof(vis));
            top = 0;
            flag = false;

            printf("Enter the length and width.\n");
            printf("Length:");
            scanf("%d", &n);
            printf("Width:");
            scanf("%d", &m);

            printf("Enter the maze:\n<'.' is ground>\n<'*' is wall>\n<'S' is start>\n<'E' is end>\n");
            for (i = 0; i < n; ++i)
                scanf("%s", maps[i]);

            for (i = 0; i < n; ++i)
            {
                for (j = 0; j < m; ++j)
                {
                    if (maps[i][j] == 'E')
                    {
                        end_x = m - i;
                        end_y = j;
                    }
                    if (maps[i][j] == 'S')
                    {
                        struct node tmp;
                        tmp.x = m - i;
                        start_x = i;
                        tmp.y = start_y = j;
                        stk[top++] = tmp;
                        vis[i][j] = true;
                    }
                }
            }
            solve(start_x, start_y);
        }
        else
        {
            printf("Can't recognize the order.Enter again:\n");
            continue;
        }
        printf("Start from (%d,%d)\nEnd in (%d,%d)\n", stk[0].y + 1, stk[0].x, end_y + 1, end_x);
        printf("Path is:\n");
        for (i = 0; i < top; ++i)
        {
            printf("(%d,%d)", stk[i].y + 1, stk[i].x);
            if (i < top - 1)
                printf(" -> ");
        }
        printf("\nPlay again? <y/n>: ");
        getchar();
    }
    printf("Bye!\n");
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值