Codeforces Round #546 C. Nastya Is Transposing Matrices
题面:
题目描述:
给出两个n x m的矩阵A,B。矩阵A可以把正方子矩阵进行“转置操作”,问:可不可以对矩阵A进行多次这样的操作,使矩阵A变为矩阵B?题目分析:
这道题是一道水题,但是我一时脑子瓦特了,看了题解也有点懵,看了代码才突然想明白的,所以特地来写一下博客。 首先,我们可以发现: 矩阵里面的一个元素可以通过多次转置转移到其他地方,其他的对应元素也会相应发生变化。所以,这个变换过程会很复杂。如果直接去暴力模拟的话,矩阵里面有500*500个元素,遍历一遍就要1e5的时间了,暴力是肯定不行的。这时,我们仍分析变化的东西会变得更为复杂,所以关键是找不变的东西,那怎么找呢?可以看一下样例:由于样例1,2太简单了,我们就不去分析它们。我们看看样例3:



1 #include <stdio.h> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 int n, m, A, B; 6 vector<int> a[1005], b[1005]; 7 8 int main(){ 9 scanf("%d%d", &n, &m); 10 for(int i = 0; i < n; i++){ 11 for(int j = 0; j < m; j++){ 12 scanf("%d", &A); 13 a[i+j].push_back(A); //将行列之和相同的元素加入到同一组 14 } 15 } 16 for(int i = 0; i < n; i++){ 17 for(int j = 0; j < m; j++){ 18 scanf("%d", &B); 19 b[i+j].push_back(B); 20 } 21 } 22 23 for(int i = 0; i < n+m; i++){ 24 //排序,方便下面判断 25 sort(a[i].begin(), a[i].end()); 26 sort(b[i].begin(), b[i].end()); 27 28 if(a[i] != b[i]){ //判断:行列之和相同时,两个矩阵包含的元素是否相同 29 printf("NO\n"); 30 return 0; 31 } 32 } 33 printf("YES\n"); 34 return 0; 35 }
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

更多精彩