• 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;
    }
    

      

  • 相关阅读:
    完美世界经典版本881外挂
    ShowModal 动态创建窗体和释放窗体
    HTML 颜色代码大全
    padding margin border 的四值顺序
    三 C# Socket通信 窗体控件与多线程
    Java解压缩Zip 文件
    八 C# Socket通信 通信协议设计
    CSS+DIV实现鼠标经过背景变色
    七 C# Socket通信 阻塞性线程的快速终止
    二 C# Socket通信模式
  • 原文地址:https://www.cnblogs.com/Run-dream/p/3858467.html
Copyright © 2020-2023  润新知