题目描述(题目链接)
你被困在一个多层停车场。您的任务是仅使用楼梯离开停车场。出口总是在一楼的右下角。
创建一个采用矩阵的函数,其中:
0 表示免费停车位。
1 表示楼梯。
2 表示您的起始位置,可以在停车场的任何一层。
出口总是在一楼的右下角。
您必须使用楼梯 1 才能下一层。
除了一楼,每一层只有一个楼梯,一楼没有任何楼梯。 请你设计并返回一个最快离开停车场的字符串。
输入输出格式
输入格式
第一行 N 表示循环的次数。
第二行有 test_data 表示 测试数据的字符串,这些字符串中间都用空格隔开。
输出格式
返回离开停车场的字符串。
输入输出样例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
解释
表示向右走三下,向下走两下,再向右走一下。
说明/提示
arr = [[1, 0, 0, 0, 2],[0, 0, 0, 0, 0]
]
# 从2开始,向左移动4次=“L4”
# 从楼梯下 1 步 = “D1”
# 向右移动 4 次从右下角退出 = "R4"
解题思路:
这题他没说给的测试数据的一行元素有多少个,但目测的话,这道题估计所有测试数据都是一行元素大概是5个,但还是严谨点,
- 题目说了是矩阵,那么可以通过先获取一行元素来判断出一行元素有多少个,
- 因为一层楼只有一个楼梯,那么下楼的路径是定了的,所以不用担心什么最快,先从矩阵找出2,也就是起始值,然后找1下楼,怎么输出路径的话看说明提示,讲的很清楚
- 注意若没有移动则不输出,也就是没有L0,D0,R0
解题代码:
C++代码:
#include<bits/stdc++.h>
using namespace std;
#define N 100
int a[N][N];
int n,x;//n是行,x是列
void print(int right,int left)//输出左走或右走
{if(right)cout<<'R'<<right<<" ";elsecout<<'L'<<left<<" ";
}
void fun(int row,int column)
{int i,right=0,left=0,down=0;for(i=0;i<x;i++)if(a[row][i]==1)//找到楼梯break;if(column>i)//判断下楼是向左走,还是向右走left+=column-i;elseright+=i-column;print(right,left);if(row<n-1)//由于我是正着将元素存入的数组,最高楼层对应的行为0,所以下楼行下标增大{while(a[row][i]==1)//处理出现一个楼梯接着下一楼梯的情况{row++;//连续下楼down+=1;}cout<<'D'<<down<<" ";if(row==n-1)//下到一楼时{if(i!=x-1)//若不是刚好楼梯下完刚好是出口cout<<'R'<<x-i-1<<" "; }else//未下到一楼fun(row,i);}
}
int main()
{cin>>n;string c;cin.ignore();//在接收完n后,其后有一个换行符,可以用ignore()去掉换行符getline(cin,c);//用字符串先获取第一行元素for(int i=0;c[i];i++)if(isdigit(c[i])){a[0][x]=c[i]-'0';x++;//得出列}for(int i=1;i<n;i++)//再获取剩下得元素for(int j=0;j<x;j++)scanf("%d",&a[i][j]);for(int i=0;i<n;i++)for(int j=0;j<x;j++){if(a[i][j]==2)//找到起点{fun(i,j);return 0; }}return 0;
}
C代码:
为了好想一点,这里就倒着存入数组了,这样下楼时行下标就是递减了
#include<stdio.h>
#include<string.h>
#include<ctype.h>//isdigit()判断数字字符函数的头文件
# define N 100
int a[N][N];
int n,c;
void fun(int row,int column)
{int right=0,left=0,down=0;int i;for(i=0;i<c;i++)if(a[row][i]==1)break;if(column>i)printf("L%d ",column-i);elseprintf("R%d ",i-column);if(row>0){while(a[row][i]==1){row--;down++;}printf("D%d ",down);if(row==0){if(i!=c-1)printf("R%d ",c-i-1);}elsefun(row,i);}
}
int main()
{scanf("%d",&n);getchar();char s[N]={0};fgets(s,N,stdin);for(int i=0;s[i];i++){if(isdigit(s[i])){a[n-1][c]=s[i]-'0';c++;}}for(int i=n-2;i>=0;i--)for(int j=0;j<c;j++)scanf("%d",&a[i][j]);for(int i=n-1;i>=0;i--)for(int j=0;j<c;j++){if(a[i][j]==2)fun(i,j);}return 0;
}