hdu 4739 Zhuge Liang's Mines DFS
http://acm.hdu.edu.cn/showproblem.php?pid=4739
题意:
给定100*100的矩阵中n(n<= 20)个点,每次只能一走能够形成正方形的四个点,正方形平行于X,Y轴,求最多可以移除的点。
思路:
比赛时,脑子直接蒙了,或许是好久没做题的原因吧。哎...只要预处理出所有额正方形,然后注意处理重点情况就欧了。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include <sstream> #include <stack> #include <map> #include <queue> #define CL(arr, val) memset(arr, val, sizeof(arr)) #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define ll long long #define L(x) (x) << 1 #define R(x) (x) << 1 | 1 #define MID(l, r) (l + r) >> 1 #define Min(x, y) (x) < (y) ? (x) : (y) #define Max(x, y) (x) < (y) ? (y) : (x) #define E(x) (1 << (x)) #define iabs(x) (x) < 0 ? -(x) : (x) #define OUT(x) printf("%I64d\n", x) #define keyTree (chd[chd[root][1]][0]) #define Read() freopen("din.txt", "r", stdin) #define Write() freopen("dout.txt", "w", stdout); #define M 107 #define N 27 using namespace std; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; const int inf = 0x7f7f7f7f; const int mod = 1000000007; const double eps = 1e-8; const int R = 100007; struct sqp { int a1,a2,a3,a4; }sq[M]; int nSq; struct Point { int x,y; }p[N]; vector<int> pt[M][M];//记录每个位置点的个数 bool vt[M],use[M]; int n,ans; void dfs(int p,int num) { ans = max(ans,num); for (int i = p; i < nSq; ++i) { int a1 = sq[i].a1,a2 = sq[i].a2,a3 = sq[i].a3, a4 = sq[i].a4; if (!vt[a1] && !vt[a2] && !vt[a3] && !vt[a4]) { vt[a1] = vt[a2] = vt[a3] = vt[a4] = true; dfs(p + 1, num + 1); vt[a1] = vt[a2] = vt[a3] = vt[a4] = false; } } } int main() { while (scanf("%d",&n)) { if (n == -1) break; for (int i = 0; i <= 100; ++i) { for (int j = 0; j <= 100; ++j) { pt[i][j].clear(); } } for (int i = 0; i < n; ++i) { scanf("%d%d",&p[i].x,&p[i].y); pt[p[i].x][p[i].y].push_back(i); } nSq = 0; CL(use,false); for (int i = 0; i < n; ++i) { int x = p[i].x; int y = p[i].y; int x1,y1; if (pt[x][y].size() >= 4)//同一位置多个点的处理 { for (size_t j = 0; j < pt[x][y].size(); j += 4) { sq[nSq].a1 = pt[x][y][j]; sq[nSq].a2 = pt[x][y][j + 1]; sq[nSq].a3 = pt[x][y][j + 2]; sq[nSq].a4 = pt[x][y][j + 3]; nSq++; } } for (x1 = x + 1, y1 = y + 1; x1 <= 100 && y1 <= 100; ++x1, ++y1) { if (pt[x][y].size() > 0 && pt[x1][y].size() > 0 && pt[x][y1].size() > 0 && pt[x1][y1].size() > 0) { sq[nSq].a1 = pt[x][y][0]; sq[nSq].a2 = pt[x1][y][0]; sq[nSq].a3 = pt[x][y1][0]; sq[nSq].a4 = pt[x1][y1][0]; for (size_t j = 0; j < pt[x][y].size(); ++j) { if (!use[pt[x][y][j]]) { sq[nSq].a1 = pt[x][y][j]; use[pt[x][y][j]] = true; } } for (size_t j = 0; j < pt[x1][y].size(); ++j) { if (!use[pt[x1][y][j]]) { sq[nSq].a2 = pt[x1][y][j]; use[pt[x1][y][j]] = true; } } for (size_t j = 0; j < pt[x][y1].size(); ++j) { if (!use[pt[x][y1][j]]) { sq[nSq].a3 = pt[x][y1][j]; use[pt[x][y1][j]] = true; } } for (size_t j = 0; j < pt[x1][y1].size(); ++j) { if (!use[pt[x1][y1][j]]) { sq[nSq].a4 = pt[x1][y1][j]; use[pt[x1][y1][j]] = true; } } nSq++; } } } ans = 0; dfs(0,0); CL(vt,false); printf("%d\n",ans*4); } return 0; }