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;
}
posted @ 2020-10-22 21:33  LT-Y  阅读(294)  评论(0)    收藏  举报