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;
}

  

hdu 4739 Zhuge Liang's Mines DFS的更多相关文章

  1. hdu 4739 Zhuge Liang's Mines (简单dfs)

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. hdu 4739 Zhuge Liang's Mines 随机化

    Zhuge Liang's Mines Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.p ...

  3. HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. hdu 4739 Zhuge Liang's Mines

    一个简单的搜索题,唉…… 当时脑子抽了,没做出来啊…… 代码如下: #include<iostream> #include<stdio.h> #include<algor ...

  5. HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)

    题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...

  6. HDOJ 4739 Zhuge Liang&#39;s Mines

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. 2013 ACM/ICPC Asia Regional Hangzhou Online hdu4739 Zhuge Liang's Mines

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. HDU 4772 Zhuge Liang&#39;s Password (简单模拟题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4772 题面: Zhuge Liang's Password Time Limit: 2000/1000 ...

  9. HDU 4048 Zhuge Liang's Stone Sentinel Maze

    Zhuge Liang's Stone Sentinel Maze Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/327 ...

随机推荐

  1. 【BZOJ2137】submultiple 高斯消元求伯努利数

    [BZOJ2137]submultiple Description 设函数g(N)表示N的约数个数.现在给出一个数M,求出所有M的约数x的g(x)的K次方和. Input 第一行输入N,K.N表示M由 ...

  2. [WIFI] WIFI 破解(初级)

    话不多说,先来看看字典破解 wpa2 的效果 =================================== ========================================= ...

  3. python webdriver中对不同下拉框通过文本值的选择

    在自动化中python对下拉框的处理网上相对实例比较少,其它前辈写的教程中对下拉也仅仅是相对与教程来说的,比如下面: m=driver.find_element_by_id("Shippin ...

  4. java如何重命名文件?

    /** * 修改文件名 * @param oldFilePath 原文件路径 * @param newFileName 新文件名称 * @param overriding 判断标志(如果存在相同名的文 ...

  5. Hibernate数据类型映射

    Hibernate映射类型分为两种:内置的映射类型和客户化映射类型.内置映射类型负责把一些常见的Java类型映射到相应的SQL类型:此外,Hibernate还允许用户实现UserType或Compos ...

  6. Flum入门必备知识

    1.flume概念 flume是分布式的,可靠的,高可用的,用于对不同来源的大量的日志数据进行有效收集.聚集和移动,并以集中式的数据存储的系统. flume目前是apache的一个顶级项目. flum ...

  7. spring的AOP个人理解和使用

    1什么是AOP:AOP是面向切面编程,也就是说面向某个功能模块编程,典型的应用就是Spring的声明式事务, Spring的AOP事务解析: 在以前的事务管理是要融合在逻辑代码中的,在逻辑代码中决定事 ...

  8. HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...

  9. HanLP https://pypi.python.org/pypi/sumy/

    HanLP - 汉语言处理包 http://hanlp.linrunsoft.com/doc.html https://pypi.python.org/pypi/sumy/

  10. 【mlflow】mlflow打包、启动、换用mysql backend、mysql配置

    mlflow是一个自动化机器学习平台,支持python2也支持python3 mlflow9.0添加了数据库作为tracking data的存储: https://github.com/mlflow/ ...