HDU 4462

状态压缩

从讲完课开始写

一直写到三点

先是没有考虑结果可能为0(都能放置稻草人的空地)

再是

鬼使神差地把题目看错

N*N是指点数而不是小格数

最后

莫名其妙的多出了个break

完美的做大死

现在整个人处于一种要疯癫的状态

上代码

#include <iostream>
using namespace std;


int ABS(int a)//绝对值
{
    return (a>0)?a:a*(-1);
}

int main()
{
    int N;
    cin>>N;
    while(N!=0)
    {
        int K;
        cin>>K;

        int *r = new int[K+1];
        int *c = new int[K+1];
        for(int i = 1; i < K+1; i++)
        {
            cin>>r[i]>>c[i];
        }

        int *R = new int[K+1];
        for(int i = 1;i < K+1; i++)
        {
            cin>>R[i];
        }

        int matrix[51][51]= {0};
        for(int i =1;i<N+1;i++)//把所有的初始化为0
        {
            for(int j = 1;j < N+1;j++)
            {
                matrix[i][j]=0;
            }
        }

        for(int i =1;i<K+1;i++)//可以放置的点设为1(空地)
        {
           matrix[r[i]][c[i]]=1;
        }

        int ans = 99999999;
        bool alrOk = true;
        for(int a = 1;a<N+1;a++)//预判是否不用放
        {
            for(int b =1;b<N+1;b++)
            {
                if(matrix[a][b]==0)
                {
                    alrOk = false;
                    break;
                }
            }
        }
        if(alrOk)
        {
            ans = 0;
        }


        for(int i = 0;i<=(1<<K)-1;i++)//用二进制来表示每个位置是否放置
        {
            int flag =0;
            bool ok = true;

            int grid[52][52] ={0};//由于运行时会修改数据所以新增一个来供修改(也可以不新增把前面那段初始化代码复制过来)
            for(int e = 1;e<N+1;e++)
            {
                for(int f =1;f<N+1;f++)
                {
                    grid[e][f]=matrix[e][f];
                }
            }

            for(int j =0;j<K;j++)
            {
                if(i&(1<<j))//每位进行判断
                {
                    flag++;
                    for(int a =1;a<N+1;a++)
                    {
                        for(int b =1;b<N+1;b++)
                        {
                            if(ABS(a-r[j+1])+ABS(b-c[j+1])<=R[j+1])
                            {
                               grid[a][b]=1;
                            }
                        }
                    }
                }
            }

            for(int a = 1;a<N+1;a++)//check是否完全覆盖
            {
                for(int b =1;b<N+1;b++)
                {
                    if(grid[a][b]==0)
                    {
                        ok = false;
                        break;
                    }
                }
           
            }
            if(ok)
            {
                ans = flag<ans?flag:ans;
                break;
            }
        }
        if(ans==99999999)//无法覆盖
        {
            ans = -1;
        }
        cout<<ans<<endl;
        cin>>N;
    }

    return 0;
}

  

posted @ 2014-07-21 15:12  Run_dream  阅读(142)  评论(0编辑  收藏  举报