【c语言】逃离停车场

题目描述


你被困在一个多层停车场。您的任务是仅使用楼梯离开停车场。出口总是在一楼的右下角。
其中:

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;
}

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值