- 二进制枚举方案,然后判断所有方案
- emmm 虽然看起来有1e8,但我们加上
if ((int)hh.size() != h2 || (int)ww.size() != w2) continue;
这个剪枝
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define endl '\n'
#define _(a) cout << #a << ": " << (a) << " "
#define one first
#define two second
#define pb push_back
using namespace std;
template<class T> void chkmax(T &a, T b) {a = max(a, b);}
template<class T> void chkmin(T &a, T b) {a = min(a, b);}
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
const int N = 13;
int h1, h2, w1, w2;
int g1[N][N], g2[N][N];
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> h1 >> w1;
for (int i = 0; i < h1; ++ i) for (int j = 0; j < w1; ++ j) cin >> g1[i][j];
cin >> h2 >> w2;
for (int i = 0; i < h2; ++ i) for (int j = 0; j < w2; ++ j) cin >> g2[i][j];
for (int i = 0; i < (1 << h1); ++ i) {
for (int j = 0; j < (1 << w1); ++ j) {
vector<int> ww, hh;
for (int k = 0; k < h1; ++ k) {
if (!((i >> k) & 1)) {
hh.push_back(k);
}
}
for (int k = 0; k < w1; ++ k) {
if (!((j >> k) & 1)) {
ww.push_back(k);
}
}
if ((int)hh.size() != h2 || (int)ww.size() != w2) continue;
bool ok = true;
for (int k = 0; k < h2; ++ k) {
for (int l = 0; l < w2; ++ l) {
if (g2[k][l] != g1[hh[k]][ww[l]]) {
ok = false;
break;
}
}
}
if (ok) {
cout << "Yes";
return 0;
}
}
}
cout << "No";
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70