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

Problem Description
In the ancient three kingdom period, Zhuge Liang was the most famous and smartest military leader. His enemy was Shima Yi, who always looked stupid when fighting against Zhuge Liang. But it was Shima Yi who laughed to the end.

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.

 
Input
There are no more than 15 test cases.
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.

 
Output
For each test case ,print the maximum number of mines Shima Yi removed in a line.
 
Sample Input
3
1 1
0 0
2 2
8
0 0
1 0
2 0
0 1
1 1
2 1
10 1
10 0
-1
 
Sample Output
0
4
 
Source
 
Recommend
liuyiding
 

先预处理好哪些点的组合可以构成正方形。

然后按照二进制,去寻找答案。

虽然感觉复杂度比较大,但是还是过了。

 /* ***********************************************
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题)的更多相关文章

  1. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  8. 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 ...

  9. hdu 4739 Zhuge Liang's Mines DFS

    http://acm.hdu.edu.cn/showproblem.php?pid=4739 题意: 给定100*100的矩阵中n(n<= 20)个点,每次只能一走能够形成正方形的四个点,正方形 ...

随机推荐

  1. 20155237 2016-2017-2 《Java程序设计》第7周学习总结

    20155237 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识Lambda语法 Lambda 教材的引入循序渐近.深入浅出 Lambda去重复,回忆D ...

  2. Metasploit输出重定向到文件

    Metasploit是我们经常会使用到的神器,但是运行exploit/run无法保存输出信息,查看不是很方便. 现在可以使用spool来保存输出信息: Metasploit Framework Con ...

  3. MPC&MAGIC

    MPC: Popularity-based Caching Strategy for Content Centric Networks MPC: most popular content MPC主要思 ...

  4. VS2017创建类库项目后添加不了WPF资源字典

    第一步: 先找到你需要添加的库类工程文件,位置如下: 第二步: 使用记事本文件打开,找到图片的位置,把三行代码粘贴进去,保存文件.重新打开项目: 三行代码如下: <ProjectTypeGuid ...

  5. vs 调试不进入断点

    背景 或许当时环境不知发了什么神经,就是不调试了.竟然还有这种简单错误. 解决方案---配置管理器---选择debug模式

  6. 关于 VS 2010 和 VS 2013 的警告 LNK4042

    由于我最近调整了一下 Jimi 的文件结构,导致出现了一个 LNK4042 的 warning,我并没有很重视,这个 warning 导致出现了一些错误. 我调试了几个小时,一开始并没有想到是这个 w ...

  7. Servlet3.0新特性WebFilter(Annotation Filter)详解

    摘要: Servlet3.0作为J2EE 6规范一部分,并随J2EE6一起发布,WeFilter是过滤器注解,是Servlet3.0的新特性,不需要在web.xml进行配置,简化了配置. Name T ...

  8. Android: 详解触摸事件如何传递

    当视图的层次结构比较复杂的时候,触摸事件的响应流程也变得复杂. 举例来说,你也许有一天想要制作一个手势极其复杂的 Activity 来折磨你的用户,你经过简单思索,认为其中应该包含一个 PageVie ...

  9. SSD安装记录

    这两天配置SSD,折腾了一两天,终于搞定了,记录下自己遇到的大坑. 1.安装SSD 安装参考:http://blog.csdn.net/shawncheer/article/details/53227 ...

  10. Vuejs 高仿饿了么外卖APP 百度云视频教程下载

    Vuejs 高仿饿了么外卖APP 百度云视频教程下载 链接:https://pan.baidu.com/s/1KPbKog0qJqXI-2ztQ19o7w 提取码: 关注公众号[GitHubCN]回复 ...