试题 算法提高 我们的征途是星辰大海
提交此题 评测记录
资源限制
时间限制:1.0s 内存限制:256.0MB
最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成。
共有四种方格:
‘.’ 代表空地,curiosity可以穿过它
‘#’ 代表障碍物,不可穿越,不可停留
‘S’ 代表curiosity的起始位置
‘T’ 代表curiosity的目的地
NASA将会发送一系列的命令给curiosity,格式如下:“LRUD”分别代表向左,向右,向上,向下走一步。由于地球和火星之间最近时也有55000000km!所以我们必须提前判断这一系列的指令会让curiosity最终处在什么样的状态,请编程完成它。
输入格式
第一行是一个整数T,代表有几个测试样例
每个测试样例第一行是一个整数N(1<=N<=50))代表迷宫的大小(N*N)。随后的N行每行由N个字符串组成,代表迷宫。接下来的一行是一个整数Q,代表有多少次询问,接下来的Q行每行是一个仅由“LRUD”四个字母的组成的字符串,字符转长度小于1000.
输出格式
对于每个询问输出单独的一行:
“I get there!”:执行给出的命令后curiosity最终到达了终点。
“I have no idea!”:执行给出的命令后curiosity未能到达终点。
“I am dizzy!”:curiosity在执行命令的过程中撞到了障碍物。
“I am out!”:代表curiosity在执行命令的过程中走出了迷宫的边界。
Sample Input
2
2
S.
#T
2
RD
DR
3
S.#
.#.
.T#
3
RL
DDD
DDRR
Sample Output
I get there!
I am dizzy!
I have no idea!
I am out!
I get there!
解题思路:建图,模拟。面向过程。。。。。。
AC代码如下:
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
int G[56][56];
int N;
vector<string> res;
int Sx,Sy;
int singleMove(int x,int y){
if( (x>=1 && x<=N) && (y>=1 && y<=N) ){
int sign=G[x][y];
switch(sign){
case 0:{
break;
}
case 1:{
res.push_back("I am dizzy!");
break;
}
case 3:{
res.push_back("I get there!");
break;
}
}
return sign;
}
else{
res.push_back("I am out!");
return 4;
}
}
void QFunction(string od){
int len=od.size();
int curX=Sx,curY=Sy;
int sit=-1;
for(int i=0;i<len;i++){
char c=od[i];
switch(c){ //每一步 都必须走
case 'L':{
curY--;
sit=singleMove(curX,curY);
break;
}
case 'R':{
curY++;
sit=singleMove(curX,curY);
break;
}
case 'U':{
curX--;
sit=singleMove(curX,curY);
break;
}
case 'D':{
curX++;
sit=singleMove(curX,curY);
break;
}
}
if(sit==1 || sit==4 || sit==3){
break;
}
if(i==len-1 && (sit==0 || sit==2 )){
res.push_back("I have no idea!");
}
}
}
void Read(){
cin>>N;
memset(G,0,sizeof(G));
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
char c;
cin>>c;
switch(c){
case '.':{
G[i][j]=0;//‘.’ 代表空地,curiosity可以穿过它
break;
}
case '#':{
G[i][j]=1;//‘#’ 代表障碍物,不可穿越,不可停留
break;
}
case 'S':{
G[i][j]=2;//‘S’ 代表curiosity的起始位置
Sx=i;
Sy=j;
break;
}
case 'T':{
G[i][j]=3;//‘T’ 代表curiosity的目的地
break;
}
}
}
}
int Q;
cin>>Q;
for(int i=1;i<=Q;i++){
string od;
cin>>od;
QFunction(od);
}
}
int main(int argc, char** argv) {
int T;
cin>>T;
for(int i=1;i<=T;i++){
Read();
}
for(int i=0;i<res.size();i++){
cout<<res[i]<<endl;
}
return 0;
}