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;
}
hdu 4739 Zhuge Liang's Mines DFS的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- hdu 4739 Zhuge Liang's Mines
一个简单的搜索题,唉…… 当时脑子抽了,没做出来啊…… 代码如下: #include<iostream> #include<stdio.h> #include<algor ...
- HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)
题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...
- HDOJ 4739 Zhuge Liang's Mines
Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 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 ...
- HDU 4772 Zhuge Liang's Password (简单模拟题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4772 题面: Zhuge Liang's Password Time Limit: 2000/1000 ...
- 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 ...
随机推荐
- Xshell配置ssh免密码登录-密钥公钥(Public key)
1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1 ...
- angular中对象与字符串之间的转换
1.angular 里 字符串与对象互转 angular.toJson();将字符串转成对象 angular.forJson(); 将字符串转成对象 2.angular 循环 <scr ...
- 利用Dockerfile构建一个基于CentOS 7镜像
利用Dockerfile构建一个基于CentOS 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像. Dockerfile内容如下: FROM centosMAINTA ...
- docx4j基本操作
最近需要用docx4j来对docx进行一些操作,用到的技术是docx4j,这个技术在国内其实用的不是很多,看了一些博主的文章,有些感悟,做了一些总结,如果有疑问或错误之处欢迎交流. 创建包: Word ...
- Elasticsearch之settings和mappings(图文详解)
Elasticsearch之settings和mappings的意义 简单的说,就是 settings是修改分片和副本数的. mappings是修改字段和类型的. 记住,可以用url方式来操作它们,也 ...
- python中super的使用
转自:http://python.jobbole.com/86787/ super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, ...
- PHP的线性安全和非线性安全的区别
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方 ...
- eclipse怎么导出可执行jar包
在eclpse中找到你要导出的java程序 选中它 单击文件 -->export 在弹出的export对话框中找到 jar File 单击选中-->next 按图示顺序依次 选好你的jav ...
- 编程当道,学点Python技术好傍身
为了填满AI时代的人才缺口,编程语言教育都从娃娃抓起了!如果你还不懂Python是什么将来怎么给孩子辅导作业呢? Python新手入门教程 近期,浙江省信息技术课程改革方案出台,Python言语现已断 ...
- Arthur and Brackets
n<605设计出n对夸号 给出n个条件每个条件为[l,r] 表示第i对夸号右夸号离左夸号的距离,然后夸号的右夸号出现的顺序必须按照给的顺序 出现, 那么如果存在就输出否则输出impossilb ...