• 2020杭电多校 C / HDU 6879


    题意:

    t组输入,每组输入一个s

    你需要输出一个r行c列的阵列,这个阵列中‘X’代表炸弹,‘.’表示没有炸弹

    对于‘.’这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置一共有几个炸弹,那么这个数值就是多少

    你输出的r行c列阵列要满足将所有‘.’位置的数值加起来之和要等于s

    题解:

    网上有一种随机数生成这个阵列的方式

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define between(x, a, b) (a<=x && x<=b)
     4 const int dir[8][2] = {1, 0, 0, 1, -1, 0, 0, -1, -1, -1, -1, 1, 1, -1, 1, 1};
     5 int n;
     6 
     7 map<int, vector<vector<char>>> mp;
     8 
     9 int solve(vector<vector<char>> a) {
    10     int r = a.size();
    11     int c = a[0].size();
    12     int res = 0;
    13     for (int i = 0; i < r; i++) {
    14         for (int j = 0; j < c; j++) {
    15             if (a[i][j] == '.') {
    16                 int cnt = 0;
    17                 for (int l = 0; l < 8; l++) {
    18                     int dx = i + dir[l][0];
    19                     int dy = j + dir[l][1];
    20                     if (between(dx, 0, r - 1) && between(dy, 0, c - 1) && a[dx][dy] == 'X') {
    21                         cnt++;
    22                     }
    23                 }
    24                 res += cnt;
    25             }
    26         }
    27     }
    28     return res;
    29 }
    30 
    31 void init() {
    32     srand((int) time(0));
    33     for (int k = 1; k <= 50000; k++) {
    34         int r = (rand() % 25) + 1;
    35         int c = (rand() % 25) + 1;
    36         vector<vector<char>> a(r, vector<char>(c));
    37         for (int i = 0; i < r; i++) {
    38             for (int j = 0; j < c; j++) {
    39                 a[i][j] = (rand() % 2) ? 'X' : '.';
    40             }
    41         }
    42         int sum = solve(a);
    43         mp[sum] = a;
    44     }
    45 }
    46 
    47 int main() {
    48     ios::sync_with_stdio(false);
    49     cin.tie(0), cout.tie(0);
    50     
    51     init();
    52     int T;
    53     cin >> T;
    54     for (int cs = 1; cs <= T; cs++) {
    55         cin >> n;
    56         vector<vector<char>> a = mp[n];
    57 
    58         int r = a.size();
    59         int c = a[0].size();
    60         cout << r << " " << c << endl;
    61         for (int i = 0; i < r; i++) {
    62             for (int j = 0; j < c; j++) {
    63                 cout << a[i][j] << (j == c - 1 ? "
    " : "");
    64             }
    65         }
    66     }
    67     return 0;
    68 }
    View Code

    另一种方式如下(参考:https://www.cnblogs.com/stelayuri/p/13538892.html):

    如下所示一个地雷的贡献就是8

    那么如果s是8的倍数,那就for循环构造多个这样的造型就可以

    然后你找出来s=1、2、3、4、5、6、7的时候地雷怎么放置,特判一下s<8的情况

    然后再找一下s=8k+m(1<=m<=7)

    这种类型的构造一下

     

     

     

     

     

     

    代码:

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 
      4 int mp[1010][28][28];
      5 int maxCol[1010];
      6 
      7 void init()
      8 {
      9     for(int i=8;i<=1000;i++)
     10     {
     11         int les=i/8,j,k;
     12         for(j=2;j<=24;j+=2)
     13         {
     14             for(k=2;k<=24;k+=2)
     15             {
     16                 mp[i][j][k]=1;
     17                 if(--les==0)
     18                     break;
     19             }
     20             if(les==0)
     21                 break;
     22         }
     23         switch(i%8)
     24         {
     25             case 0:
     26                 maxCol[i]=j+1;
     27                 break;
     28             case 1:
     29                 mp[i][1][1]=1;
     30                 maxCol[i]=j+1;
     31                 break;
     32             case 2:
     33                 mp[i][1][1]=mp[i][1][2]=1;
     34                 maxCol[i]=j+1;
     35                 break;
     36             case 3:
     37                 mp[i][1][2]=1;
     38                 maxCol[i]=j+1;
     39                 break;
     40             case 4:
     41                 mp[i][1][2]=mp[i][2][1]=1;
     42                 maxCol[i]=j+1;
     43                 break;
     44             case 5:
     45                 mp[i][j+2][2]=1;
     46                 maxCol[i]=j+2;
     47                 break;
     48             case 6:
     49                 mp[i][j+2][1]=mp[i][j+2][2]=1;
     50                 maxCol[i]=j+2;
     51                 break;
     52             case 7:
     53                 mp[i][j+3][1]=mp[i][j+3][2]=mp[i][j+2][1]=1;
     54                 maxCol[i]=j+3;
     55                 break;
     56         }
     57     }
     58 }
     59 
     60 int main()
     61 {
     62     init();
     63     int T,S;
     64     scanf("%d",&T);
     65     while(T--)
     66     {
     67         scanf("%d",&S);
     68         if(S>=8)
     69         {
     70             printf("%d 25
    ",maxCol[S]);
     71             for(int i=1;i<=maxCol[S];i++)
     72             {
     73                 for(int j=1;j<=25;j++)
     74                 {
     75                     if(mp[S][i][j])
     76                         putchar('X');
     77                     else
     78                         putchar('.');
     79                 }
     80                 putchar('
    ');
     81             }
     82         }
     83         else if(S==0)
     84         {
     85             puts("1 1");
     86             puts(".");
     87         }
     88         else if(S==1)
     89         {
     90             puts("1 2");
     91             puts("X.");
     92         }
     93         else if(S==2)
     94         {
     95             puts("1 3");
     96             puts("X.X");
     97         }
     98         else if(S==3)
     99         {
    100             puts("2 2");
    101             puts("X.");
    102             puts("..");
    103         }
    104         else if(S==4)
    105         {
    106             puts("2 2");
    107             puts("X.");
    108             puts("X.");
    109         }
    110         else if(S==5)
    111         {
    112             puts("2 3");
    113             puts(".X.");
    114             puts("...");
    115         }
    116         else if(S==6)
    117         {
    118             puts("2 3");
    119             puts("XX.");
    120             puts("...");
    121         }
    122         else if(S==7)
    123         {
    124             puts("3 3");
    125             puts("XX.");
    126             puts("X..");
    127             puts("...");
    128         }
    129     }
    130     return 0;
    131 }
    View Code
  • 相关阅读:
    C代码优化的一些方法
    读书笔记之:C++程序设计原理与实践(其他)[+++]
    读书笔记之:C++ Primer Plus(第5版)
    使用SoapFormatter 类序列化
    C# 多线程学习系列
    winform中读取嵌入的xml文件
    使用Web Service上(服务器端访问)
    jquery ajax调用webservice
    ashx文件和HttpHandler
    以Window服务作为wcf的寄主
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13545431.html
Copyright © 2020-2023  润新知