1 条题解
-
0
算法标签:
模拟
题解:
我们很容易发现,题目要求输出的图中如果先不管 H-O 键的话,也就是说光看 H 和 O 原子的话,它们的位置是有规律的,H 原子分两种,一种是从点(2,2)开始横,纵坐标分别以 4 递增,另一种是从点(4,4)开始横,纵坐标分别以 4 递增。而 O 原子的个数就是 n*n ,从(2,4)开始,以 4 递增。我们可以先画出一张没有 H-O 键的图来,然后在根据 数字矩阵中的值,给每一个 O 原子加上两个 H-O 键就可以了。
最后加上 H-O 键的时候,按 数字矩阵 分3种情况,1 和 -1 时,很好处理,关键是 0 的时候。仔细看题,有这么一句话: ……the sum of each row and column is 1 ……
就是这句了,解题点,根据 数字矩阵 中该行(或列)上 从开始到现在的点的数值和,可以判断,这个 H-O 键的方向:
上下:该列第一行到该行的数值和,0代表 H-O 在这个 O 原子下面,1是上。
左右:该行第一列到该列的数值和,0代表 H-O 在这个 O 原子左面,1是右。
#include <iostream> #include <cstring> using namespace std; int in[15][15]; char out[50][50]; int main() { int num, m; int rpo, cpo, iuh; int i, j; num = 1; while (cin >> m && m != 0) { memset(out, 0, sizeof(out)); if (num > 1) cout << endl; cout << "Case " << num++ << ":\n\n"; for (i = 0; i < m; i++) for (j = 0; j < m; j++) cin >> in[i][j]; rpo = 0; for (i = 0; i < m; i++) { cpo = 0; for (j = 0; j < m; j++) { if (in[i][j] == 0) { if (cpo == 0 || out[rpo][cpo - 2] != 'H') { if (rpo == 0 || out[rpo - 2][cpo + 2] == 'H') iuh = 1; else iuh = -1; memcpy(out[rpo] + cpo, "H-O ", sizeof(char) * 4); memcpy(out[rpo + iuh] + cpo, " | ", sizeof(char) * 4); memcpy(out[rpo + iuh * 2] + cpo, " H ", sizeof(char) * 4); } else { if (rpo == 0 || out[rpo - 2][cpo] == 'H') iuh = 1; else iuh = -1; memcpy(out[rpo] + cpo, "O-H ", sizeof(char) * 4); memcpy(out[rpo + iuh] + cpo, "| ", sizeof(char) * 4); memcpy(out[rpo + iuh * 2] + cpo, "H ", sizeof(char) * 4); } cpo += 4; } else if (in[i][j] == 1) { memcpy(out[rpo] + cpo, "H-O-H ", sizeof(char) * 6); cpo += 6; } else if (in[i][j] == -1) { memcpy(out[rpo - 2] + cpo, "H ", sizeof(char) * 2); memcpy(out[rpo - 1] + cpo, "| ", sizeof(char) * 2); memcpy(out[rpo] + cpo, "O ", sizeof(char) * 2); memcpy(out[rpo + 1] + cpo, "| ", sizeof(char) * 2); memcpy(out[rpo + 2] + cpo, "H ", sizeof(char) * 2); cpo += 2; } } rpo += 4; } for (i = 0; i < 4 * m + 3; i++) cout << "*"; cout << endl; for (i = 0; i < 4 * m - 3; i++) { cout << "*"; for (j = 0; j < 4 * m + 1; j++) { if (out[i][j] != '\0') cout << out[i][j]; else cout << " "; } cout << "*" << endl; } for (i = 0; i < 4 * m + 3; i++) cout << "*"; cout << endl; } return 0; }
- 1
信息
- ID
- 100
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者