zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    【linux基础】usleep和sleep的区别
    【算法基础】opencv函数approxPolyDP和Ramer-Douglas-Peucker Algorithm
    【算法基础】散点轮廓算法-Alpha Shapes
    【图像处理算法基础】图像分割经典算法-泛洪算法FloodFill
    .net core 部署在Linux系统上运行的环境搭建
    Linux部署Net Core网站,三种自定义绑定端口号的方法(UseUrls,UseKestrel,手动指定)
    .NetCore部署Linux环境搭建
    .Net Core 项目发布到Linux
    .Net Core 项目发布到Linux
    Linux桌面操作系统排行榜
  • 原文地址:https://www.cnblogs.com/E-star/p/3329849.html
Copyright © 2011-2022 走看看