HDU 4739

来源:互联网 发布:手机淘宝店铺上货教程 编辑:程序博客网 时间:2024/05/16 11:15
题意:有很多石子,要四个四个的消去,而且这四个点要构成一个正方形,为了方便题目规定正方形的边平行于坐标轴,要注意可能有重复的点
思路:取出所有符合要求的正方形,用状态压缩记录每个正方形的状态,枚举每个正方形。

#include <stdio.h>#include <vector>#include <algorithm>#include <string.h>using namespace std;struct node{    int x;    int y;}point[25];int dp[(1 << 20) + 2];int max(int a, int b){    return a>b?a:b;}bool cmp(node a, node b){    if(a.y == b.y) return a.x < b.x;    return a.y < b.y;}int judge(int i, int j, int k, int l){    if(point[i].x == point[j].x&&point[i].y == point[j].y) return 0;    if(point[i].y!=point[j].y||point[i].x!=point[k].x||point[j].x!=point[l].x||point[k].y!=point[l].y) return 0;    if(abs(point[j].x - point[i].x) != abs(point[i].y - point[k].y)) return 0;    return 1;}int main(){    int i, j, k, l, n, x, y, mine;    while(1)    {        scanf("%d", &n);        if(n == -1) break;        for(i = 0;i < n;i++) scanf("%d %d", &point[i].x, &point[i].y);        vector<int>g[25];        sort(point, point + n, cmp);        memset(dp, 0, sizeof(dp));        for(i = 0;i < n;i++)            for(j = i + 1;j < n;j++)                for(k = j + 1;k < n;k++)                    for(l = k + 1;l < n;l++)                    {                        if(judge(i, j, k, l))                        {                            int mine = 0;;                            mine |= (1<<i);                            mine |= (1<<j);                            mine |= (1<<k);                            mine |= (1<<l);                            g[i].push_back(mine);                        }                    }        for(mine = 0;mine < (1 << n);mine++)            for(i = 0;i < n;i++)            {                if(mine&(1 << i))//不包含i石子                {                    for(j = 0;j < g[i].size();j++)                    {                        int s = g[i][j];                        if((s|mine) == mine) dp[mine] = max(dp[mine], dp[mine^s] + 4);//mine^s表示没有加入这块石头                    }                }            }        printf("%d\n", dp[(1<<n)-1]);    }    return 0;}

0 0