没啥好说的,直接开始吧
这道题,很难读懂,但是昂,你一旦读懂了,就算点可能那不全,但肯定会有分拿的。
系好安全带,我要开始讲啦(源代码在最后)
题说有n+1层楼,但我们让他是n层就可以了,最顶层了要输出了嘛。这栋楼有n层高,一栋有m个房间,有些房间有梯子,有些没有,这三个条件,我们就可以用一个三维数组来表示(用两个二维数组也是可以实现,但时间复杂度可能会超)。int a[N][M][2]先建一个这样的数组,然后输入,这是,我们需要有远见一些。我们后面需要按照第一次进入的那个房间里的数字在这一层里转圈,但我们可以不用转圈。再建一个数组s[n]记录每一层的梯子数量,然后在输入里写一个判断
if(a[i][j][0]==1){
s[i]++;
}
这样就可以记录每一层的梯子数量啦,拿每一层的梯子数量去除以房间里的数字的余数,就是我们需要走过的有梯子的房间数量了。
然后就到了关键的地方了,在for循环里套一个while去逛这层的房间,然后输入的第一次进入的房间号接着用,记录下一层第一次进入的房间号,然后一直在楼里逛街,到最顶层就好了(可别忘了设一个变量记录第一次进入的房间的数字,不然可就白做了)。
最后就是源代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,M,x;
int ans=0;
cin>>N>>M;
int a[N][M][2];
int s[N];
for (int i=0;i<N;i++){
for (int j=0;j<M;j++){
cin>>a[i][j][0]>>a[i][j][1];
if(a[i][j][0]==1){
s[i]++;
}
}
}cin>>x;
for(int i=0;i<N;i++){
ans=(a[i][x][1]+ans)%20123;
int bianshu=a[i][x][1]%s[i];
if(bianshu==0){
bianshu=s[i];
}if(a[i][x][0]==1){
bianshu--;
}while(bianshu!=0){
x++;
if(x==M){
x=0;
}if(a[i][x][0]==1){
bianshu--;
}
}
}cout<<ans;
return 0;
}
最后的最后,如果有没明白的地方,私信我,我一对一讲哦😁