码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4462

时间:2014-07-22 00:08:34      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:os   io   for   re   c   amp   

状态压缩,K<=10, 0--2^k-1的二进制每一位对应第K个稻草人是否放(0表示不放,1表示放)

注意稻草人坑是不需要覆盖的

全是坑的时候,输出0;(不要问我为什么知道,因为我被坑了4次   T_T)

#include <iostream>
#include <string.h>
using namespace std;
struct pos{
  int x,y;
}p[15];
int f[55][55],r[15];
int n,k;
int abs(int a){
    if(a<0)return -a;
    return a;
}
void change(int b){
    int xx,yy;
    int l=r[b];
    for(int i=-l;i<=l;i++){
        xx=p[b].x+i;
        if(xx<1||xx>n)continue;
        for(int j=abs(i)-l;j<=l-abs(i);j++){
            yy=p[b].y+j;
            if(yy<1||yy>n)continue;
            f[yy][xx]=1;
        }
    }
}
void init(){
    memset(f,0,sizeof(f));
    for(int i=0;i<k;i++){
        f[p[i].y][p[i].x]=1;
    }
}
bool solve(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!f[i][j])return false;
        }
    }
    return true;
}
int main(){
    int ans,flag;
    while(cin>>n){
        if(n==0)break;
        cin>>k;
        for(int i=0;i<k;i++){
            cin>>p[i].y>>p[i].x;
        }
        for(int i=0;i<k;i++){
            cin>>r[i];
        }
        ans=k+1;
        init();
        if(solve()){cout<<"0"<<endl;}
        else {
            for(int i=0;i<(1<<k);i++){
                flag=0;
                init();
                for(int j=0;j<k;j++){
                    if(i&1<<j){
                        change(j);
                        flag++;
                    }
                }
                if(solve()){
                    if(ans>flag)ans=flag;
                }
            }
            if(ans<=k)cout<<ans<<endl;
            else cout<<"-1"<<endl;
        }
    }
}

HDU 4462,布布扣,bubuko.com

HDU 4462

标签:os   io   for   re   c   amp   

原文地址:http://www.cnblogs.com/Mr-Xu-JH/p/3858639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!