W
e
l
c
o
m
e
: )

CF237B Young Table 题解

CF237B Young Table 题解

题目描述

CF237B Young Table

题目解法

题目中要求满足以下条件:

对所有的 \(i,j (1< i\leq n,1\leq j\leq c_i)\),满足 \(a_{i,j}>a_{i-1,j}\)

对所有的 \(i,j (1\leq i\leq n,1 < j\leq c_i)\),满足 \(a_{i,j}>a_{i,j-1}\)

不难发现,对于样例:

4 3 5
6 1
2

将该表格进行排序后是满足条件的,如下:

1 2 3
4 5
6

又因为题目中给的是一个全排列,可以先记录好数字的位置然后再交换位置即可。

细节就看代码吧。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 52

int len[maxn];
int mp[maxn][maxn];

void upd(int &x, int &y) // 表格中向后移动一步
{
    if(y==len[x]) y=1, x++;
    else y++;
}

pair<int, int> pos[maxn*maxn]; // 记录坐标
struct ans{int a, b, c, d;};
vector<ans> vc; // 记录答案

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>len[i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=len[i];j++)
            cin>>mp[i][j], pos[mp[i][j]]={i, j};
    int sum=accumulate(len+1, len+1+n, 0); // 求出数字个数
    int x=0, y=0;
    for(int i=1;i<sum;i++)
    {
        upd(x, y); // 移动一步
        if(mp[x][y]==i) continue; // 特判
        vc.push_back({x,y,pos[i].first,pos[i].second});
        int l=mp[x][y];
        swap(mp[x][y], mp[pos[i].first][pos[i].second]);
        swap(pos[l], pos[i]);
    }
    cout<<vc.size()<<'\n';
    for(auto [a, b, c, d]:vc) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n'; // 输出答案
}
posted @ 2024-08-25 20:55  Jimmy-LEEE  阅读(25)  评论(0)    收藏  举报