1 条题解
-
0
思路
标记初始位于第 个格子 ,每秒沿行优先顺序移动到下一个格子,走到最后一个格子后再回到第 个格子,形成循环。
的矩阵共有 个格子,因此标记的位置以 为周期循环。经过 秒后,只需把 对 取模即可得到它在"格子序列"中的偏移量。
- 建立映射:把二维坐标 映射为一维索引 (从 开始),这样第 个格子的索引是 。
- 计算最终位置:初始索引为 ,经过 秒后索引为 。
- 逆向映射:索引
index对应第 行、第 列。
本题 较小,也可以直接模拟 次移动(参考代码即采用这种做法:按行优先把全部格子预先存进数组,再用一个下标循环前进)。为避免下标越界,每次先判断是否已经停在最后一格,是则回到 ,否则加 。
时间复杂度 ,空间复杂度 ;若改用取模的数学方法则可直接做到 。
代码
#include<bits/stdc++.h> #define int long long #define dd double #define str string #define el cout << endl #define re return #define ff first #define ss second #define pll pair<int,int> #define pdd pair<dd,dd> #define all(x) x.begin(),x.end() #define pb push_back #define sz(x) (int) x.size() using namespace std; void go(){ int n,t;cin>>n>>t; int x=1,y=1; // 按行优先顺序把所有格子存成一维序列,下标即"第几个格子" vector<pll>v; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ v.pb({i,j}); } } int ind = 0; // 当前所在格子的下标,起点为第 0 个 while (t--) { // 走到最后一格后回到第一格,否则前进一格 if(ind >= n*n-1){ ind = 0; }else{ ind++; } } // 输出最终位置的行和列 cout<<v[ind].ff<<' '<<v[ind].ss;el; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); int t=1; // 本题只有一组数据,不需要读入测试组数 while(t--){ go(); } return 0; }
- 1
信息
- ID
- 16
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者