B-矩阵
描述
给出了两个矩阵 A和B ,每个矩阵的大小为 n×m。 你可以执行以下操作来对 AA 进行无限次矩阵处理:
取 A 的任何平方正方形子矩阵并将其转置(即子矩阵的第 i 行和第 j 列中的子矩阵元素在转置后将位于第 j 行和第 i 列中,并且转置子矩阵本身将保留在矩阵 A )中的位置。 你的的任务是检查是否有可能将矩阵 A 转换为矩阵 B 。
操作实例
矩阵 M 的平方正方形子矩阵是 M 里的一个正方形矩阵(正方形矩阵的所有元素,如图绿色部分所示),正方形矩阵的边长 k 可以是 1≤k≤min(n,m)
输入
第一行一个 T ,表示测试用例个数。
对于每个测试用例,第一行包含两个整数 n 和 m ,它们之间用空格隔开-分别是 A 和 B 中的行数和列数。
接下来的 n 行中的每行包含 m 个整数,这些行的第 i 行中的第 j 个数字表示矩阵 A 的第 i 行的第 j 个元素。
接下来的 n 行中的每行包含 m 个整数,这些行的第 i 行中的第 j 个数字表示矩阵 B 的第 i 行的第 j 个元素。
输出
一共 T 行。
对于每个测试用例,如果可以将 A 转换为 B ,则打印“ YES”(不带引号),否则可以打印“ NO”(不带引号)。
样例
1
2 2
1 1
6 1
1 6
1 1
YES
2
2 2
4 4
4 5
5 4
4 4
3 3
1 2 3
4 5 6
7 8 9
1 4 7
2 5 6
3 8 9
NO
YES
提示
对于 10% 的数据:
1≤T≤2,1≤n,m≤2,1≤A{i,j}≤103,1≤B{i,j}≤103,∑n≤2,∑m≤2
对于 100% 的数据:
1≤T≤500,1≤n,m≤500, 1≤A{ij}≤109,1≤B{ij}≤109,∑n≤500,∑m≤500
CODE
AC代码
#include <bits/stdc++.h>
using namespace std;
#define rep(a, b, c) for(int a = b; a <= c; a++)
#define dep(a, b, c) for(int a = b; a >= c; a--)
int t, n, m, mpa[501][501], mpb[501][501];
int main(){
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
rep(i, 1, n){
rep(j, 1, m){
scanf("%d", &mpa[i][j]);
}
}
rep(i, 1, n){
rep(j, 1, m){
scanf("%d", &mpb[i][j]);
}
}
int x, y, ppp = 0;
rep(i, 1, n){//行为起点的对角线枚举
map<char, int> mp;
x = 0; y = i + 1;
int len = i;
rep(j, 1, len){
x++; y--;
mp[(char)(mpa[x][y] - '0')]++;
}
x = 0; y = i + 1;
rep(j, 1, len){
x++; y--;
if(mpa[x][y] == mpb[x][y]){
mp[(char)(mpa[x][y] - '0')]--;
continue;
}
int xx = 0, yy = i + 1, p = 0;
rep(k, 1, len){
xx++; yy--;
if(mp[(char)(mpa[x][y] - '0')] && mpa[x][y] == mpb[xx][yy]){
mp[(char)(mpa[x][y] - '0')]--;
p = 1;
break;
}
}
if(!p){
ppp = 1;
printf("NO\n");
break;
}
}
if(ppp){
break;
}
}
if(!ppp)
printf("YES\n");
}
return 0;
}
没有未来的未来不是我想要的未来

浙公网安备 33010602011771号