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/Others)
Total Submission(s): 239 Accepted Submission(s): 110
Once, Zhuge Liang sent the arrogant Ma Shu to defend Jie Ting, a very important fortress. Because Ma Shu is the son of Zhuge Liang's good friend Ma liang, even Liu Bei, the Ex. king, had warned Zhuge Liang that Ma Shu was always bragging and couldn't be used, Zhuge Liang wouldn't listen. Shima Yi defeated Ma Shu and took Jie Ting. Zhuge Liang had to kill Ma Shu and retreated. To avoid Shima Yi's chasing, Zhuge Liang put some mines on the only road. Zhuge Liang deployed the mines in a Bagua pattern which made the mines very hard to remove. If you try to remove a single mine, no matter what you do ,it will explode. Ma Shu's son betrayed Zhuge Liang , he found Shima Yi, and told Shima Yi the only way to remove the mines: If you remove four mines which form the four vertexes of a square at the same time, the removal will be success. In fact, Shima Yi was not stupid. He removed as many mines as possible. Can you figure out how many mines he removed at that time?
The mine field can be considered as a the Cartesian coordinate system. Every mine had its coordinates. To simplify the problem, please only consider the squares which are parallel to the coordinate axes.
In each test case:
The first line is an integer N, meaning that there are N mines( 0 < N <= 20 ).
Next N lines describes the coordinates of N mines. Each line contains two integers X and Y, meaning that there is a mine at position (X,Y). ( 0 <= X,Y <= 100)
The input ends with N = -1.
1 1
0 0
2 2
8
0 0
1 0
2 0
0 1
1 1
2 1
10 1
10 0
-1
4
先预处理好哪些点的组合可以构成正方形。
然后按照二进制,去寻找答案。
虽然感觉复杂度比较大,但是还是过了。
/* ***********************************************
Author :kuangbin
Created Time :2013/9/15 星期日 14:08:43
File Name :2013杭州网络赛\1002.cpp
************************************************ */ #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std; pair<int,int>p[];
int n;
vector<int>vec; bool judge(pair<int,int>p1,pair<int,int>p2,pair<int,int>p3,pair<int,int>p4)
{
if(p3.first - p1.first != && p3.second - p1.second == p3.first - p1.first)
{
if(p2.first == p3.first && p2.second == p1.second)
if(p4.first == p1.first && p4.second == p3.second)
return true;
}
return false;
}
//判断p1p2p3p4四个点能不能形成正方形
bool check(pair<int,int>p1,pair<int,int>p2,pair<int,int>p3,pair<int,int>p4)
{
if(judge(p1,p2,p3,p4))return true;
if(judge(p1,p2,p4,p3))return true;
if(judge(p1,p3,p2,p4))return true;
if(judge(p1,p3,p4,p2))return true;
if(judge(p1,p4,p2,p3))return true;
if(judge(p1,p4,p3,p2))return true; swap(p1,p2);
if(judge(p1,p2,p3,p4))return true;
if(judge(p1,p2,p4,p3))return true;
if(judge(p1,p3,p2,p4))return true;
if(judge(p1,p3,p4,p2))return true;
if(judge(p1,p4,p2,p3))return true;
if(judge(p1,p4,p3,p2))return true;
swap(p1,p2); swap(p1,p3);
if(judge(p1,p2,p3,p4))return true;
if(judge(p1,p2,p4,p3))return true;
if(judge(p1,p3,p2,p4))return true;
if(judge(p1,p3,p4,p2))return true;
if(judge(p1,p4,p2,p3))return true;
if(judge(p1,p4,p3,p2))return true;
swap(p1,p3); swap(p1,p4);
if(judge(p1,p2,p3,p4))return true;
if(judge(p1,p2,p4,p3))return true;
if(judge(p1,p3,p2,p4))return true;
if(judge(p1,p3,p4,p2))return true;
if(judge(p1,p4,p2,p3))return true;
if(judge(p1,p4,p3,p2))return true;
swap(p1,p4); return false; } int dp[<<];
int solve(int s)
{
if(dp[s] != -)return dp[s];
int ans = ;
int sz = vec.size();
for(int i = ;i < sz;i++)
if((s&vec[i]) == vec[i])
{
ans = max(ans,+solve(s^vec[i]));
}
return dp[s] = ans;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n) == )
{
if(n == -)break;
vec.clear();
for(int i = ;i < n;i++)
scanf("%d%d",&p[i].first,&p[i].second);
//找出所有可以组成正方形的组合
for(int i = ;i < n;i++)
for(int j = i+;j < n;j++)
for(int x = j+;x < n;x++)
for(int y = x+;y < n;y++)
if(check(p[i],p[j],p[x],p[y]))
{
vec.push_back((<<i)|(<<j)|(<<x)|(<<y));
}
memset(dp,-,sizeof(dp));
int tot = (<<n) -;
printf("%d\n",*solve(tot));
}
return ;
}
HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)的更多相关文章
- HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 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 (简单dfs)
Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 4762 Cut the Cake (2013长春网络赛1004题,公式题)
Cut the Cake Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)
Count The Pairs Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- hdu 4739 Zhuge Liang's Mines DFS
http://acm.hdu.edu.cn/showproblem.php?pid=4739 题意: 给定100*100的矩阵中n(n<= 20)个点,每次只能一走能够形成正方形的四个点,正方形 ...
随机推荐
- 有关楼层滚动且对应楼层Nav导航高亮显示
$(document).ready(function(e) { //定义数组,储存楼层距离顶部的高度(floorsTop) var floorsTop=[]; function floorsTopF( ...
- 非常有助于理解二极管PN结原理的资料
https://www.zhihu.com/question/60053574/answer/174137061 我理解的半导体 pn 结的原理,哪里错了? https://blog.csdn.net ...
- mysql学习------权限机制
MySQL服务器通过MySQL权限表来控制用户对数据库的访问,MySQL权限表存放在mysql数据库里,由mysql_install_db脚本初始化.这些MySQL权限表分别user,db,table ...
- 001_软件waf
一.优秀的软件waf开源软件 <1>openwaf介绍 http://www.oschina.net/p/openwaf http://git.oschina.net/miracleqi ...
- 安装Python3.6.4后,在使用numpy时报错RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
原因: 因为安装numpy用的是 pip来安装的 pypi官方对于numpy的库已经升级了,但是升级后的版本与其他的库不匹配 所以报错 解决: 先把已经安装的numpy卸载: pip uninstal ...
- 360加固保的dex脱壳方法
完全测试了看雪论坛的方法,发现并没有脱壳,依然无法反编译 http://bbs.pediy.com/thread-213377.htm 使用上面方法的结果是会得到16个dex文件,只有一个是与程序相关 ...
- Vue零散知识点
1.vue中的<router-view></router-view>的作用,它是和vue的路由相结合的,它的作用是将路由匹配到的组件渲染在里面.比如说你要跳转,如何没有< ...
- Java编程的逻辑 (3) - 基本运算
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Using MongoDB in C#
In order to use MongoDB in C#, you can import MongoDB C# Driver to your project. It's best to create ...
- NFS配置及开机自动挂载
环境:Red Hat 6.7 服务端:192.168.163.128 客户端:192.168.163.131 背景:解决多个服务器之间数据共享 环境检查: 1.检查服务器是否安装nfs服务 rpm ...