HDU 4739 Zhuge Liang's Mines

来源:互联网 发布:淘宝亲宝贝什么意思 编辑:程序博客网 时间:2024/05/22 15:48

题意:

在一个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;}


                                             
0 0
原创粉丝点击