1006: Hero In Maze

2024-04-27 03:38
文章标签 hero 1006 maze

本文主要是介绍1006: Hero In Maze,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。 时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T 500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。
他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。

输入

题目包括多组测试数据。 每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。 紧接着有M行,N列字符,由".","*","P","S"组成。其中 "." 代表能够行走的空地。 "*" 代表墙壁,Jesse不能从此通过。 "P" 是公主所在的位置。 "S" 是Jesse的起始位置。 每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。 输入以0 0 0结束。

输出

如果能在规定时间内救出公主输出“YES”,否则输出“NO”。

样例输入

copy

4 4 10
....
....
....
S**P
0 0 0

样例输出

YES

 

解决代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZEH 30
#define MAXSIZE 400typedef struct {int i,j;int pre;
}Point;//点的结构体typedef struct{Point data[MAXSIZE];int front,rear;
}Queue;//存放点的队列int initQueue(Queue *queue);//初始化队列
int insQueue(Queue *queue,Point point);//元素进队
int outQueue(Queue *queue,Point *point);//元素出队
int isQueueEmpty(Queue queue);//判断队是否为空int main() {Queue queue;initQueue(&queue);Point start,end;//定义迷宫的起点和终点start.i=start.j=start.pre=-1;//初始化起始点end.i=end.j=end.pre=-1;//初始化终点int m,n,t;int i,j;int flag=0;//标志是否找到路径int map[MAXSIZEH][MAXSIZEH];//存放地图scanf("%d %d %d",&n,&m,&t);//输入迷宫的行,列和getchar();do{//输入地图for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%c",&map[i][j]);if(map[i][j]=='S'){//找出起点start.i=i;start.j=j;start.pre=-2;}if(map[i][j]=='P'){//找到终点end.i=i;end.j=j;end.pre=-2;}}getchar();}if (end.pre!=-2||start.pre!=-2){//如果找不到起点或者终点结束程序printf("输入有误!!!\n");return 0;} else{printf("输入无误,程序执行!!!\n");}insQueue(&queue,start);//将起点进队Point nowPoint;//  int k=0;while (!isQueueEmpty(queue)){//队不为空时循环//   k++;//  printf("程序执行%d次\n",k);outQueue(&queue,&nowPoint);//出队if(nowPoint.i==end.i&&nowPoint.j==end.j){//如果找到终点,结束查找flag=1;break;}for(i=0;i<4;i++){//四种情况,对当前点的上下左右分别查找符合条件进队Point *a;a=(Point*)malloc(sizeof(Point));*a=nowPoint;switch (i){case 1:a->i++;break;case 2:a->j++;break;case 3:a->i--;break;case 4:a->j--;break;}if(a->i>=0&&a->i<m&&a->j>=0&&a->j<n){if(map[a->i][a->j]=='.'||map[a->i][a->j]=='P'){a->pre=queue.front;insQueue(&queue,*a);}}free(a);}}nowPoint=queue.data[queue.front];// printf("输入的路径\n");int key=0;//计算路径长度while (nowPoint.pre>=0){key++;//printf("I:%d J:%d pre:%d\n",nowPoint.i,nowPoint.j,nowPoint.pre);nowPoint=queue.data[nowPoint.pre];}//printf("%d",key);if(flag==0){printf("NO\n");} else{if(key<=t)//与时间比较printf("YES\n");else{printf("NO\n");}}scanf("%d %d %d",&n,&m,&t);getchar();}while(!(m==0&&n==0&&t==0));return 0;
}int initQueue(Queue *queue){queue->front=-1;queue->rear=-1;return 1;
}int insQueue(Queue *queue,Point point){if(queue->rear+1>=MAXSIZE){return 0;} else{queue->rear+=1;queue->data[queue->rear]=point;}return 1;
}int outQueue(Queue *queue,Point *point){if(queue->front==queue->rear){return 0;} else{queue->front++;*point=queue->data[queue->front];return 1;}
}
int isQueueEmpty(Queue queue){//返回真为空,返回假为不空if(queue.front==queue.rear){return 1;} else{return 0;}
}

 

这篇关于1006: Hero In Maze的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939428

相关文章

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些

HDU 4035 Maze (树状dp + 概率)

OJ题目 : click here ~~~ 题目分析 :这篇文章已经说的很好很好了 , 直接借用 ,猛戳~~ int n;double k[10002] , e[10002];double A[10002] , B[10002] , C[10002];vector<int> List[10002];bool dfs(int u , int father){if(List[u].s

【HDU】 4067 Random Maze 费用流

Random Maze Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1114    Accepted Submission(s): 387 Problem Description In the game “A C

CodeForces 404E Maze 1D

题意: 一个机器人在数轴上的0点  给一串指令机器人按照指令走  为了使机器人最后一步走到一个从来没来过的位置  我们可以在数轴上放石头  每次机器人被石头卡住他就跳过当前的那个指令  问  最少使用石头前提下  一共几种放石头方法 思路: 很容易想到如果最后一个指令是L  那么机器人一定会停在0点的左边  因为如果停在右边  最后一步一定走在之前来过的位置上  同理最后一个指令是R

九度考研真题 浙大 2010-2浙大1006:ZOJ问题

//题目1006:ZOJ问题 #include<iostream> #include<string.h> using namespace std; int main() { char s[1010]; char a[1010];//开始部分 char b[1010]; //中间部分  char c[1010];//后部分  int num1=0,n

题解AtCoder ABC 358 F Easiest Maze

一道模拟题。 思路 最短的路线是直接竖着走下来,经过 n n n 个格子,所以 k k k 最小是 n n n。如果想要延长路线,可以采用九转大肠的形状,就像这样: 可以发现,每次向左走之后都必须走回来,所以每次新经过的格子数是偶数,得到 k − n k-n k−n 是偶数才有可行的方案。 首先,把整张图表的初始状态设为如下形式(即每个格点都是独立的): +++++S++o|o|o

POJ 1006 Biorhythms(中国剩余定理 )

题目链接:click here~~ 【题目大意】:  人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出

HDU 4940(杭电多校#7 1006) Destroy Transportation system(瞎搞)

题目地址:HDU 4940 当时这个题一看就看出来了是网络流的最小割,然后就一直在想建图。。然后突然发现,应该要让T集合的数目最少,不然只要有两个,那这两个的每一个都可以跑到S集合,使得T集合变小。那就只能是1个了。然后。。枚举就好了。。但是虽然觉得这么做肯定没错。。但是不敢敲。。因为当时都3个小时了才只有10个队过了。。。后来又想了几遍后觉得这样没错,就写完交上了。果然AC。。。 代码如下:

POJ 3026 Borg Maze (BFS+MST)

把是A或者S的地方当做一个顶点存起来。 之后用BFS求任意两点的距离,把边存起来用最小生成树算法求:使得所有顶点都连通的最小花费 /************************************************ Author: fisty* Created Time: 2015/2/28 16:42:55* File Name : J.cpp**********

Aizu 2538 Stack Maze【记忆化搜索】

其实我并不知道我的姿势算是什么。 一开始想着用二维的记忆化搜索,用 dp[x][y] dp[x][y]表示 (x,y)→(H,W) (x,y)\rightarrow(H,W)能够得到的最大happy值。但是很遗憾的是,这样没法记录,在前进的路上,我有多少个宝石、能够经过多少宝石洞。 所以就想着如何记录,最后发现难以记录。如果是这样的记忆化搜索,时间复杂度大约是 O(n2) O(n^2),那么就