68 lines
2.0 KiB
C++
68 lines
2.0 KiB
C++
|
|
#include <bits/stdc++.h>
|
|||
|
|
using namespace std;
|
|||
|
|
|
|||
|
|
// 常量定义
|
|||
|
|
const int N = 10010; // 最大楼层数
|
|||
|
|
const int M = 110; // 每层最大房间数
|
|||
|
|
const int mod = 20123; // 取模基数
|
|||
|
|
|
|||
|
|
// 全局变量
|
|||
|
|
int n, m; // n:楼层数(不含顶层), m:每层房间数
|
|||
|
|
int k; // 当前所在房间号
|
|||
|
|
int a[N][M]; // a[i][j]:第i层j号房间是否有楼梯(0/1)
|
|||
|
|
int b[N]; // b[i]:第i层有楼梯的房间总数
|
|||
|
|
int num[N][M]; // num[i][j]:第i层j号房间的指示牌数字
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 主函数:模拟寻宝过程,计算密钥
|
|||
|
|
* 算法思路:
|
|||
|
|
* 1. 读取输入数据,统计每层有楼梯的房间数
|
|||
|
|
* 2. 从初始房间开始,逐层向上
|
|||
|
|
* 3. 每层根据指示牌数字计算要走的步数
|
|||
|
|
* 4. 模拟行走过程,找到上楼房间
|
|||
|
|
* 5. 累加指示牌数字作为密钥
|
|||
|
|
*/
|
|||
|
|
int main() {
|
|||
|
|
// 读取楼层和房间数
|
|||
|
|
cin >> n >> m;
|
|||
|
|
|
|||
|
|
int res = 0; // 密钥结果
|
|||
|
|
|
|||
|
|
// 读取每层每个房间的数据
|
|||
|
|
for (int i = 0; i < n; i++) {
|
|||
|
|
for (int j = 0; j < m; j++) {
|
|||
|
|
cin >> a[i][j] >> num[i][j];
|
|||
|
|
b[i] += a[i][j]; // 统计本层有楼梯的房间数
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取初始房间号
|
|||
|
|
cin >> k;
|
|||
|
|
/*
|
|||
|
|
t t t
|
|||
|
|
*/
|
|||
|
|
// 逐层处理
|
|||
|
|
for (int i = 0; i < n; i++) {
|
|||
|
|
// 累加当前房间的指示牌数字(模20123)
|
|||
|
|
int t = num[i][k];
|
|||
|
|
res = (res + t) % mod;
|
|||
|
|
|
|||
|
|
// 计算实际需要走的步数
|
|||
|
|
t %= b[i]; // 取模避免重复绕圈
|
|||
|
|
if (!t) t = b[i];// 处理模0的情况
|
|||
|
|
|
|||
|
|
// 模拟行走过程
|
|||
|
|
int sum = 0; // 已走的有效步数
|
|||
|
|
while (sum < t) {
|
|||
|
|
sum += a[i][k]; // 只有有楼梯的房间才算一步
|
|||
|
|
if (sum == t) break; // 达到目标步数
|
|||
|
|
|
|||
|
|
// 移动到下一个房间(环形处理)
|
|||
|
|
k = (k + 1) % m;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 输出结果
|
|||
|
|
printf("%d\n", res);
|
|||
|
|
return 0;
|
|||
|
|
}
|