题解:ABC264 C - Matrix Reducing
·难度
入门
·题目
C - Matrix Reducing (atcoder.jp)
·思路
题解(of ABC264 C-Matrix Reducing)_哔哩哔哩_bilibili
分别用h1位二进制(h3)和w1位二进制(w3)表示a的每一行和每一列是否选了(h3的倒数第i位为1表示选了第i行,w3的倒数第j位为1表示选了第j列),之后判断选出的这几行几列是否与b相等。
·代码
Submission #42301878 - freee Programming Contest 2022(AtCoder Beginner Contest 264)
#include<bits/stdc++.h>
#define MAX 11
using namespace std;
int a[MAX][MAX]={},b[MAX][MAX]={},h[MAX]={},w[MAX]={},ch=0,cw=0,h1=0,h2=0,w1=0,w2=0;
int main(){
scanf("%d%d",&h1,&w1);
for(int i=1;i<=h1;i++){
for(int j=1;j<=w1;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d%d",&h2,&w2);
for(int i=1;i<=h2;i++){
for(int j=1;j<=w2;j++){
scanf("%d",&b[i][j]);
}
}
//输入
int h3=1<<h1,w3=1<<w1;
for(int i=0;i<h3;i++){
//h1位二进制
ch=0;
for(int j=1;j<=h1;j++){
int tmp=(i>>(j-1))&1;
if(tmp==1){
ch++;
h[ch]=j;
}
}
//记录被选中的行
if(ch==h2){
//一定要保证和b行数相同
for(int j=0;j<w3;j++){
cw=0;
for(int k=1;k<=w1;k++){
int tmp=(j>>(k-1))&1;
if(tmp==1){
cw++;
w[cw]=k;
}
}
if(cw==w2){
//在此之前与行同理
bool flg=true;
for(int k=1;k<=ch&&flg==true;k++){
for(int l=1;l<=cw&&flg==true;l++){
if(b[k][l]!=a[h[k]][w[l]]){
//遍历每行每列,如果有任何一个数不相等都不行
flg=false;
}
}
}
if(flg==true){
//可以变成,输出Yes
printf("Yes\n");
return 0;
}
}
}
}
}
//至死都没能输出,出于同情输出一个No
printf("No\n");
return 0;
}