





参考程序
#include "vision.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 405;
int num[MAXN][MAXN], tot;
int pre[MAXN], suf[MAXN];
int getbool(int n, int m, int k) {
for (int i = 2; i <= n + m; i++) {
vector <int> opt; opt.clear();
for (int j = 1; j <= n; j++) {
int k = i - j;
if (k >= 1 && k <= m) opt.push_back(num[j][k]);
}
if (i != 2) opt.push_back(pre[i - 1]);
pre[i] = add_or(opt);
}
for (int i = n + m; i >= 2; i--) {
vector <int> opt; opt.clear();
for (int j = 1; j <= n; j++) {
int k = i - j;
if (k >= 1 && k <= m) opt.push_back(num[j][k]);
}
if (i != n + m) opt.push_back(suf[i + 1]);
suf[i] = add_or(opt);
}
vector <int> opt; opt.clear();
for (int i = 2, j = i + k; j <= n + m; i++, j++) {
vector <int> tmp; tmp.clear();
tmp.push_back(pre[i]), tmp.push_back(suf[j]);
opt.push_back(add_and(tmp));
}
int resa = add_or(opt);
for (int i = 1; i <= n; i++)
for (int j = 1, k = m; j <= k; j++, k--)
swap(num[i][j], num[i][k]);
for (int i = 2; i <= n + m; i++) {
vector <int> opt; opt.clear();
for (int j = 1; j <= n; j++) {
int k = i - j;
if (k >= 1 && k <= m) opt.push_back(num[j][k]);
}
if (i != 2) opt.push_back(pre[i - 1]);
pre[i] = add_or(opt);
}
for (int i = n + m; i >= 2; i--) {
vector <int> opt; opt.clear();
for (int j = 1; j <= n; j++) {
int k = i - j;
if (k >= 1 && k <= m) opt.push_back(num[j][k]);
}
if (i != n + m) opt.push_back(suf[i + 1]);
suf[i] = add_or(opt);
}
opt.clear();
for (int i = 2, j = i + k; j <= n + m; i++, j++) {
vector <int> tmp; tmp.clear();
tmp.push_back(pre[i]), tmp.push_back(suf[j]);
opt.push_back(add_and(tmp));
}
int resb = add_or(opt);
for (int i = 1; i <= n; i++)
for (int j = 1, k = m; j <= k; j++, k--)
swap(num[i][j], num[i][k]);
opt.clear();
opt.push_back(resa), opt.push_back(resb);
return add_or(opt);
}
void construct_network(int n, int m, int k) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
num[i][j] = tot++;
if (k == n + m - 2) {
getbool(n, m, k);
return;
}
int greater = getbool(n, m, k + 1);
int geq = getbool(n, m, k);
int ngr = add_not(greater);
vector <int> opt; opt.clear();
opt.push_back(geq), opt.push_back(ngr);
add_and(opt);
}


