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
", 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
",ans*4);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/E-star/p/3329849.html