解题思路:
1.由题可得,一共有n层,每层有m个房间,房间是从0-m-1来编号的,每个房间里面有一个指示牌数字,代表要走这个数字的楼梯
2.可以想到利用二维数组来存储每层的房间信息,因为每个房间有两个数字分别代表是否有楼梯和指示牌数字,所以利用结构体来存储,bool x;int num;
3.观察m和n的范围,并且num的数值,因为数值num可能很大,而每层的房间又不会超过100个,所以他在每层中走的时候,肯定会有周期性的问题,在输入每层的房间信息时,就将该层的有楼梯的房间数量计算出来,存储到数组shuliang中
4.然后每层开始遍历,遍历每层前,计数器sum用来记录走过了多少楼梯,temp用来标注此时的房间号,ans为累加该房间的指示牌数字,因为数字可能很大,结果对20123取余,所以在运算过程就取余ans=(ans+a[i][temp].num)%20123,接着计算需要遍历的房间res=(a[i][temp].num-1)%shuliang[i]+1,然后判断该房间是否有楼梯,如果有sum++,判断sum是否等于res,如果相等,结束while循环,开始下一层,如果不等,,房间号temp++,判断temp是否为m,如果是回到0,形成环状
5.最后输出ans
#include<bits/stdc++.h>
using namespace std;
struct node{
bool x;//表示是否有楼梯
int num;//表示指示牌的数字
}a[10005][105];
int shuliang[10005];
int main()
{
int n,m,temp,ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m-1;j++)
{
cin>>a[i][j].x>>a[i][j].num;
shuliang[i]+=a[i][j].x;
}
}//将每层的m个房间的信息输入到结构体数组中
cin>>temp;
for(int i=1;i<=n;i++)
{
int sum=0;//每层初始化计数器为0
ans=(ans+a[i][temp].num)%20123;//加上此时房间的指示数字
int res=(a[i][temp].num-1)%shuliang[i]+1;//形成周期,因为指示数字可能很大,但是房间比较少
while(1)
{
if(a[i][temp].x==1)//判断该房间如果有楼梯则计数器累加
{
sum++;
if(sum==res)//如果计数器等于所走的有楼梯的房间数
{
break;//结束循环
}
}
temp++;//书签移动,去下一个房间
if(temp==m)//如果书签移动到m号房间,则变为0号房间
temp=0;//形成环状
}
}
cout<<ans;
return 0;
}