3732. 矩阵复原【思维⭐从元素出发记录唯一的元素对应的唯一的坐标,如果不用map可以先记录行号,确定列号的时候直接装入数组】

3732. 矩阵复原

3732. 矩阵复原【思维⭐从元素出发记录唯一的元素对应的唯一的坐标,如果不用map可以先记录行号,确定列号的时候直接装入数组】_第1张图片
输入样例:

2
2 3
6 5 4
1 2 3
1 6
2 5
3 4
3 1
2
3
1
3 1 2

输出样例:

1 2 3 
6 5 4 
3 
1 
2 

可能出于给的样例比较简单,只有两行,可以很直接通过肉眼模拟,针对每行的第一个元素,可以找到这列元素的排列,根据这列元素的排列对行进行排序,但是些许复杂,做法有AcWing 3732. 矩阵复原------暴力+排序

根据 矩阵中每个数只出现一次,唯一的位置对应着唯一的数,可以不从坐标主观出发而是从元素数值出发,记录唯一的数值对应的坐标,当然可以通过map容器,mp >,但也可以只记录其中一个行号col[x]=j,在确定列号 j 的时候,直接将这个元素装入数组a[j][col[x]]=x;

#include 
using namespace std;
#define int long long int
int n,m,k,x,T,p,y;
const int N=505;
int a[N][N];
int col[250005];
signed main(){
     cin>>T;
     while(T--){//矩阵中每个数只出现一次
        cin>>n>>m;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){//每个数的列号可以确定
                cin>>x;
                col[x]=j;//每个数只出现一次,可以记录这个数的列号
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){//每个数的行号可以确定
                cin>>x;
                a[j][col[x]]=x;
            }
        }
        for(int i=0;i<n;i++){//每个数的列号可以确定
            for(int j=0;j<m;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
     }
    return 0;
}



你可能感兴趣的:(贪心,思维,构造,矩阵,算法,c++)