您的位置:首页 > 其它

HDU 4739 Zhuge Liang's Mines

2016-11-14 09:31 337 查看
题意:在一个x-y坐标系上有N颗地雷,想要挖出一个地雷只有挖出跟它形成矩形的另外三颗雷才行,问最多可以挖出多少地雷?解题思路:记忆化搜索+状态压缩。先把所有雷的坐标按从上到下,从左到右排序,因为最多20颗雷,可以用二进制表示每颗雷的状态。然后DFS记忆化寻找矩形(四重循环确定四个点),找到了则改变雷的二进制状态然后深搜下去,遍历出所有情况,得出最大值。代码:#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <string>
#include <queue>
#include <bitset>
using namespace std;
struct Node
{
int x,y;
bool operator < (const Node &a) const
{
if(y==a.y)
return x<a.x;return y<a.y;
}
}pos[30];int n;
int dp[1<<20];int dfs(int s)
{
if(dp[s]>=0)
return dp[s];
int ret=0;
for(int i=0;i<n;++i)
{
if(s&(1<<i))
continue;
for(int j=i+1;j<n;++j)
{
if(s&(1<<j))
continue;
if(pos[j].y!=pos[i].y)
continue;
for(int k=j+1;k<n;++k)
{
if(s&(1<<k))
continue;
if(pos[k].x!=pos[i].x)
continue;
for(int l=0;l<n;++l)
{
if(l==i||l==j||l==k)
continue;
if(s&(1<<l))
continue;
if(pos[l].x!=pos[j].x||pos[l].y!=pos[k].y)
continue;
if((pos[l].x-pos[k].x) != (pos[k].y-pos[i].y))
continue;
int ts=s|(1<<i)|(1<<j)|(1<<k)|(1<<l);
ret=4+dfs(ts);
}
}
}
}
dp[s]=ret;
return ret;
}int main()
{while(cin>>n&&n!=-1)
{
for(int i=0;i<n;++i)
cin>>pos[i].x>>pos[i].y;
sort(pos,pos+n);
memset(dp,-1,sizeof(dp));
cout<<dfs(0)<<endl;
}
return 0;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: