题意:
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 }
另一种方式如下(参考: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 }