作者思路:
对于每一行每一列暴力dfs每种情况,然后看一下剩下的数字与另一个数组是否相同。
代码:(代码是在另一个OJ提交的,没过)
#include<bits/stdc++.h>
using namespace std;
int n,m,n1,m1,a[20][20],b[20][20],c[40],top,d[40],top1;
bool x[20],y[20];
inline void dfs(int k,int l){
if (k == n + 1){
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
if (x[i] && y[j]) d[++top1] = a[i][j];
if (top != top1){
top1 = 0;
return;
}
for (int i = 1;i <= top;i++) if (c[i] != d[i]){top1 = 0;return;}
printf("Yes\n");exit(0);
}
dfs(k + 1,l + 1),x[k] = true,dfs(k + 1,l + 1),x[k] = false,y[l] = true,dfs(k + 1,l + 1),x[k] = y[l] = true,dfs(k + 1,l + 1),x[k] = y[l] = false;
}
int main(){
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++) for (int j = 1;j <= m;j++) scanf("%d",&a[i][j]);
scanf("%d%d",&n1,&m1);
for (int i = 1;i <= n1;i++) for (int j = 1;j <= m1;j++) scanf("%d",&b[i][j]),c[++top] = b[i][j];
dfs(1,1);
printf("No\n");
}