迷宫中的英雄(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 列字符,由.
,*
,P
,S
组成。其中.
代表能够行走的空地。*
代表墙壁,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