hdu 1507 Uncle Tom's Inherited Land*
?
#include <iostream>#include <stdio.h>#include <memory.h>using namespace std;const int N = 105;int pre[N*N], map[N*N];bool flag[N*N], vis[N*N];int n, m, total;int find(int cur){ int k; k = cur + 1; if(cur%m+1 < m && k < total && map[k] != -1 && !flag[k]) { flag[k] = true; if(pre[k] == -1 || find(pre[k])) { pre[k] = cur; return 1; } } k = cur + m; if(k < total && map[k] != -1 && !flag[k]) { flag[k] = true; if(pre[k] == -1 || find(pre[k])) { pre[k] = cur; return 1; } } k = cur - 1; if(cur%m > 0 && k >= 0 && map[k] != -1 && !flag[k]) { flag[k] = true; if(pre[k] == -1 || find(pre[k])) { pre[k] = cur; return 1; } } k = cur - m; if(k >= 0 && map[k] != -1 && !flag[k]) { flag[k] = true; if(pre[k] == -1 || find(pre[k])) { pre[k] = cur; return 1; } } return 0;}int main(){ int i, k, t, x, y, sum; while(scanf("%d %d", &n, &m), n && m) { total = n * m; memset(vis, false, sizeof(vis)); memset(map, -1, sizeof(map)); memset(pre, -1, sizeof(pre)); for(i = 0; i < total; i++) { map[i] = i; } scanf("%d", &t); while(t--) { scanf("%d %d", &x, &y); k = (x-1)*m + (y-1); map[k] = -1; } sum = 0; for(i = 0; i < total; i++) { if(map[i] != -1) { memset(flag, false, sizeof(flag)); sum += find(map[i]); } } printf("%d\n", sum/2); for(i = 0; i < total; i++) { if(map[i] != -1 && pre[i] != -1 && !vis[pre[i]] && !vis[i]) { vis[pre[i]] = vis[i] = true; printf("(%d,%d)--(%d,%d)\n", i/m+1, i%m+1, pre[i]/m+1, pre[i]%m+1); } } printf("\n"); } return 0;}?