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. open live writer 安装 markdown 插件

    我自己用的是 OpenLiveWriter ,所以本篇只讲 OLW 的,WindowsLiveWriter 戳 MarkdownInWindowsLiveWriter,OpenLiveWriter 戳 ...

  2. 【css预处理器】------sass的基本语法------【巷子】

    001.安装sass 1.删除gem源:gem sources --remove https://rubygems.org/ 2.添加国内源:gem sources -a http://gems.ru ...

  3. Phpstorm 无法自动断点 Exception

    困扰了很久的问题了. ... 今天终于解决了,直接说解决方案吧. 在 php.ini 中增加一行配置: xdebug.default_enable = 1,然后重启Apache服务器:sudo ser ...

  4. mysql_commit() COMMIT ROLLBACK 提交 回滚 连接释放

    MySQL :: MySQL 8.0 Reference Manual :: 28.7.7.6 mysql_commit() https://dev.mysql.com/doc/refman/8.0/ ...

  5. android进入页面会定位到ListView问题解决方法

    在我们的页面中如果存在有ListView,当我们进入这个activity时,页面会定位到ListView的位置去,而不是activity的头部,这是由于ListView会去默认获取焦点所造成的. 解决 ...

  6. HTTP错误 404.17–Not Found 请求的内容似乎是脚本,因而将无法有静态文件处理程序来处理

    解决方案:切换应用程序池的模式.

  7. go-004-数据结构

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  8. OpenStack功能简介

    为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中间不够了也不能加,超了也不退钱 二 ...

  9. 如何确定Hadoop中map和reduce的个数--map和reduce数量之间的关系是什么?

    一般情况下,在输入源是文件的时候,一个task的map数量由splitSize来决定的,那么splitSize是由以下几个来决定的 goalSize = totalSize / mapred.map. ...

  10. mac 零碎

    查看主机名 import socket socket.gethostname() 可以这样安装postgresql 安装postgresql, 输入 brew install postgresql 安 ...