1 条题解

  • 0
    @ 2026-10-31 17:58:07

    思路

    标记初始位于第 11 个格子 (1,1)(1,1),每秒沿行优先顺序移动到下一个格子,走到最后一个格子后再回到第 11 个格子,形成循环。

    n×nn\times n 的矩阵共有 n2n^2 个格子,因此标记的位置以 n2n^2 为周期循环。经过 tt 秒后,只需把 tt 对 n2n^2 取模即可得到它在"格子序列"中的偏移量。

    1. 建立映射:把二维坐标 (i,j)(i,j) 映射为一维索引 (i−1)×n+(j−1)(i-1)\times n+(j-1)(从 00 开始),这样第 11 个格子的索引是 00。
    2. 计算最终位置:初始索引为 00,经过 tt 秒后索引为 (0+t) mod n2=t mod n2(0+t)\bmod n^2=t\bmod n^2。
    3. 逆向映射:索引 index 对应第 index÷n+1index\div n+1 行、第 index mod n+1index\bmod n+1 列。

    本题 n,tn,t 较小,也可以直接模拟 tt 次移动(参考代码即采用这种做法:按行优先把全部格子预先存进数组,再用一个下标循环前进)。为避免下标越界,每次先判断是否已经停在最后一格,是则回到 00,否则加 11。

    时间复杂度 O(n2+t)O(n^2+t),空间复杂度 O(n2)O(n^2);若改用取模的数学方法则可直接做到 O(1)O(1)。

    代码

    #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
    上传者