其他分享
首页 > 其他分享> > 迷宫中的英雄(C语言)

迷宫中的英雄(C语言)

作者:互联网

500 年前,Jesse 是我国最卓越的剑客。他英俊潇洒,而且机智过人。

突然有一天,Jesse 心爱的公主被魔王困在了一个巨大的迷宫中。Jesse 听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持 TT 天,他急忙赶到迷宫,开始到处寻找公主的下落。 时间一点一点的过去,Jesse 还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此 Jesse 郁郁寡欢,茶饭不思,一年后追随公主而去了。

500500 年后的今天,Jesse 托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。

他会为你提供迷宫的地图以及所剩的时间 TT。请你判断他是否能救出心爱的公主。

输入格式

第一行输入三个整数 N,M,T(1 \leq n,m \leq 20, 0 \leq T \leq 10^6)N,M,T(1≤n,m≤20,0≤T≤106) 开头,分别代表迷宫的长和高,以及公主能坚持的天数。

紧接着有 NN 行,MM 列字符,由.*PS组成。其中.代表能够行走的空地。*代表墙壁,Jesse 不能从此通过。P是公主所在的位置。S是 Jesse 的起始位置,并且这两个位置一定是空地。

每个时间段里 Jesse 只能选择“上、下、左、右”任意一方向走一步。

输出格式

如果能在规定时间内救出公主输出一行YES,否则输出一行NO。如果 Jesse 根本无法找到公主,也输出NO

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


int flag[21][21];///标记初始为0,表示未走过
int length,width,survival_days;///地图规模
char maze_map[21][21];
int dis[21][21];



typedef struct Point
{
    int x;
    int y;
}Point;

typedef struct Queue
{
    Point *step;
    int step_length,head,tail;
}Queue;

void queue_init(Queue *q,int length_inpu)
{
    q->step=(Point *)malloc(sizeof(Point)*length_inpu);
    q->step_length=length_inpu;
    q->head=0;
    q->tail=-1;
}

void queue_push(Queue *q,Point in_point)
{
    if(q->tail+1<q->step_length)
    {
        q->tail++;
        q->step[q->tail]=in_point;
    }
}

void queue_pop(Queue *q)
{
    q->head++;
}

Point queue_front(Queue *q)
{
    return q->step[q->head];
}

int queue_empty(Queue *q)
{
    if(q->head>q->tail)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void queue_clear(Queue *q)
{
    free(q->step);
    free(q);
}



int can(int x,int y)///判断能不能走能返回1不能返回0
{
    ///判断是否超界、是否走过、是否为路
    if((x>=0&&x<length)&&(y>=0&&y<width)&&flag[x][y]==0&&maze_map[x][y]!='*')
    {
        return (1);
    }
    else
    {
        return (0);
    }
}



int find_path(Queue *q,Point in_start_point,Point in_end_point)
{
    queue_push(q,in_start_point);
    flag[in_start_point.x][in_start_point.y]=1;
    while(!queue_empty(q))
    {
        Point current_point=queue_front(q);
        queue_pop(q);
        //if(current_point.x==in_end_point.x && current_point.y==in_end_point.y)
        //{
        //    if(dis[in_end_point.x][in_end_point.y]>survival_days|| dis[in_end_point.x][in_end_point.y]==0)
        //    {
        //        return 1;
        //    }
        //    else
        //    {
        //        return 0;
        //    }
        //}
        int dx[]={0,1,-1,0};
        int dy[]={1,0,0,-1};
        for(int i=0; i<4; i++)
        {///     偏移量   上一个点的x
            int nx=dx[i]+current_point.x;
            int ny=dy[i]+current_point.y;
            if(can(nx,ny))
            {
                flag[nx][ny]=1;///标记为走过//关键
                dis[nx][ny]=dis[current_point.x][current_point.y]+1;//关键
                ///入队
                Point tmp;
                tmp.x=nx;
                tmp.y=ny;
                queue_push(q,tmp);///从当前元素的后面增加元素
            }
        }
    }
    if(dis[in_end_point.x][in_end_point.y]>survival_days|| dis[in_end_point.x][in_end_point.y]==0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void output_map(char maze_map[21][21])
{
    for(int i=0;i<length;i++)
    {
        for(int j=0;j<width;j++)
        {
            printf("%c",maze_map[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    Point start_point,end_point;

    Queue *queue=(Queue *)malloc(sizeof(Queue));

    //memset(maze_map,'.',sizeof(maze_map));
    scanf("%d %d %d",&length,&width,&survival_days);
    queue_init(queue,length*width);

    for(int i=0;i<length;i++)
    {
        scanf("%s",maze_map[i]);
        for(int j=0;j<width;j++)
        {
            if(maze_map[i][j]=='S')
            {
                start_point.x=i;
                start_point.y=j;
            }
            if(maze_map[i][j]=='P')
            {
                end_point.x=i;
                end_point.y=j;
            }
        }
    }
    int temp=find_path(queue,start_point,end_point);
    if(temp)
    {
        printf("NO");
    }
    else
    {
        printf("YES");
    }
    //output_map(maze_map,length,width);
}

 

标签:return,21,int,迷宫,C语言,Queue,英雄,公主,Jesse
来源: https://blog.csdn.net/sawboy/article/details/116694786