同3020,关键是建图,对每个点的四个相邻点,根据是否有hole,建立边的关系。
//Rank:40 0ms
#include <stdio.h>
#include <string.h>
#define NL 35
#define SL NL*NL
int adj[SL][5];
int mth[SL];
bool used[SL];
bool mx[NL][NL];
int flg[NL][NL];
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bool path(int u)
{
for (int v=1; v<=adj[u][0]; v++) {
int t = adj[u][v];
if (!used[t]) {
used[t] = 1;
if (!mth[t] || path(mth[t])) {
mth[t] = u;
return 1;
}
}
}
return 0;
}
int main()
{
int m, n, k;
int i, j, r, c, nt;
while (scanf("%d%d%d", &m, &n, &k) != EOF) {
memset(mx, 0, sizeof(mx));
for (i=0; i<k; i++) {
scanf("%d%d", &c, &r);
mx[r][c] = 1;
}
if ((m*n-k)&1) {
printf("NO\n");
continue;
}
memset(adj, 0, sizeof(adj));
memset(flg, 0, sizeof(flg));
nt = 0;
for (i=1; i<=m; i++) {
for (j=1; j<=n; j++) {
if (!mx[i][j]) {
flg[i][j] = ++nt;
}
}
}
for (i=1; i<=m; i++) {
for (j=1; j<=n; j++) {
if (!mx[i][j]) {
for (int t=0; t<4; t++) {
int x = i+dir[t][0];
int y = j+dir[t][1];
if (x>=1 && x<=m
&& y>=1 && y<=n
&& !mx[x][y]) {
int f1 = flg[i][j];
int f2 = flg[x][y];
adj[f1][++adj[f1][0]] = f2;
}
}
}
}
}
int ans = 0;
memset(mth, 0, sizeof(mth));
for (i=1; i<=nt; i++) {
memset(used, 0, sizeof(used));
if (path(i)) ans++;
}
if (ans == m*n-k) {
printf("YES\n");
}else {
printf("NO\n");
}
}
return 0;
}