题目描述
你被困在一个多层停车场。您的任务是仅使用楼梯离开停车场。出口总是在一楼的右下角。
其中:
0 表示免费停车位。
1 表示楼梯。
2 表示您的起始位置,可以在停车场的任何一层。
出口总是在一楼的右下角。
您必须使用楼梯 1 才能下一层。
除了一楼,每一层只有一个楼梯,一楼没有任何楼梯。 请你设计并返回一个最快离开停车场的字符串。
输入输出格式
输入格式
第一行 N 表示有几层楼。
接下来的 N 行表示停车场。
输出格式
返回离开停车场的字符串。L、R、D分别表示向左、向右、向下移动,L、R、D后的数字表示移动的距离。
输入输出样例1
输入
2
1 0 0 0 2
0 0 0 0 0
输出
L4 D1 R4
输入输出样例2
输入
3
2 0 0 1 0
0 0 0 1 0
0 0 0 0 0
输出
R3 D2 R1
解释
表示向右走三下,向下走两下,再向右走一下。
代码如下:
#include <stdio.h>
int main()
{
int n;//n是层数
scanf("%d", &n);
int a[n][5];//变长数组,无法监视,不知为什么
for (int i = 0; i <= n - 1; i++)
{
for (int j = 0; j <= 4; j++)
{
scanf("%d", &a[i][j]);//初始化
}
}
int start = 0;//开始位置的下标
int exit = 0;//楼梯位置的下标
int exitm = 0;//上一层出口位置的下标
int count = 0;//当前的数组一维下标,可以当成楼层
//如 0 表示顶层,1 表示顶层的下一层......n - 1 表示一楼
//也可以表示下了几层楼、一次要下几层楼等。
for (int i = 0; i <= 4; i++)
{
if (a[count][i] == 2)//遍历顶楼,寻找楼梯位置
{
start = i;
break;
}
}
for (int i = 0; i <= 4; i++)
{
if (a[count][i] == 1)//遍历顶楼,寻找楼梯位置
{
exit = i;
while (1)//处理楼梯下面刚好是楼梯的情况,如D2、D3等
{
if (a[count + 1][i] == 1)//如果下面刚好是楼梯
{
count++;//就下一层楼,count也表示下楼的次数
}
else
{
break;
}
}
break;
}
}
if (start - exit > 0)//楼梯在左边
{
printf("L%d ", start - exit);
}
else if (start - exit < 0)//楼梯在右边
{
printf("R%d ", -(start - exit));//注意要加负号
}
printf("D%d ", count + 1);//count加一的原因是下到楼梯的下一层
count++;//下楼的次数加一,count表示当前所在的楼层
exitm = exit;//储存上一层的楼梯位置
//以上代码是处理只有两层楼或楼梯位置连续的情况
int c = 0;//为了接下来处理楼梯下面刚好是楼梯的情况,如D2、D3等情况,
//不能使用 printf("D%d ", count + 1);了,因为此时count
//表示下了几层楼,改用 c 表示一次下几层楼
while (count != n - 1)//如果当前的楼层是一楼的时候,退出循环
{
for (int i = 0; i <= 4; i++)//寻找当前楼层的楼梯
{
if (a[count][i] == 1)
{
exit = i;//注意上一层的楼梯存储在 exitm 中
while (1)//处理楼梯下面刚好是楼梯的情况,如D2、D3等
{
if (a[count + 1][i] == 1)
{
count++;//仍然计数下了几层楼
c++;//一次性下 c 次楼
}
else
{
break;
}
}
break;
}
}
if (exitm - exit > 0)//楼梯在左边
{
printf("L%d ", exitm - exit);
}
else if (exitm - exit < 0)//楼梯在右边
{
printf("R%d ", -(exitm - exit));//注意要加负号
}
exitm = exit;//存储当前楼层的楼梯,作为下一次寻找楼梯的起点
printf("D%d ", c + 1);//c 加一的原因是下到楼梯的下一层
c = 0;//不要忘记重置 c 的值
count++;//下到了楼梯的下一层,下楼次数再加一,直到 count = n - 1;也就是下到了一楼
}
if (4 - exit == 0)//如果下到一楼时的位置刚好是楼梯,不要打印 R0
{
return 0;
}
else
{
printf("R%d ", 4 - exit);//逃离停车场
}
return 0;
}