• HDU4462-稻草人


    思想不难,代码不易,且敲且珍惜。

    枚举的方式,假设有十个位置可以放稻草人,用二进制的形式转换一下,对每种情况判断是否全被覆盖,记录成功时稻草人的个数,每次比较选出最小的。

    注意一个陷阱,当所有的格子都被稻草人霸占的时候,是个“0”。自己的代码不能AC,又找不到明显错误,有大神的话,麻烦look一下。

    #include<iostream>
    #include<cmath>
    using namespace std;
    
    int main()
    {
       int size;
       while(cin >> size && size)
       {
    
           int field[51][51] = {0};
           int loc[21] = {0};
           int rang[11] = {0};
           int point;
           cin >> point;
    
           for(int i = 1;i <= 2 *point;i++)
           {
    
               cin >> loc[i];
           }
           for(int j = 1;j <= point;j++)
           {
    
               cin >> rang[j];
           }
    
           bool right;
           int ans = 999999,flag;
           for(int i = 0;i < (1 << point);i++)
           {
               right = true;
               flag = 0;
               for(int j = 0;j < point;j++)
               {
    
                   if(i & (1 << j))
                   {
    
                       for(int a = 1;a <= size;a ++)
                       {
    
                           for(int b = 1;b <= size;b++)
                           {
                               if((int)(abs((double)(a - loc[2*j + 1])) + abs((double)(b - loc[2*j + 2])))<= rang[j + 1] )
                               {
    
                                   field[a][b] = 1;
    
                               }
    
                           }
                       }
                       flag++;
                   }
               }
    
               for(int m = 1;m <= size;m++)
               {
    
                   for(int n = 1;n <= size;n++)
                   {
                       if(field[m][n] == 0)
                       {
    
                           right = false;
                           break;
                       }
    
    
                   }
                   if(!right)
                   {
                       break;
                   }
               }
               if(right)
               {
    
                    ans = flag < ans?flag:ans;
               }
    
           }
    
            if(flag == size * size)
            {
                cout << "0" << endl;
                continue;
            }
           if(right)
           {
    
               cout << "1" << endl;
           }
           else
           {
               cout << "-1" << endl;
           }
    
    
       }
       return 0;
    }
    
  • 相关阅读:
    JAVA理解逻辑程序的书上全部重要的习题
    体检套餐管理系统的综合版
    一路奔跑,一路寻找
    员工考勤信息管理小程序
    枚举的独特强大之处
    C#中HashTable的用法
    项目经理评分
    若想成功,请记住!
    数组的经典例子
    S1的小成果:MyKTV系统
  • 原文地址:https://www.cnblogs.com/hhhhhhhhhhhhhhhhhhhhhhhhhhh/p/3863406.html
Copyright © 2020-2023  润新知