首页 > 代码库 > HDU 4462

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++)        {            for(int j = 1;j < N+1;j++)            {                matrix[i][j]=0;            }        }        for(int i =1;i<K+1;i++)        {           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++)            {                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;}