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
原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13545431.html