洛谷P1259 黑白棋子的移动

发布时间 2023-09-01 15:56:26作者: 上原歩夢

题解:

  模拟棋子移动,最后几行找不到规律所以直接打表

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 char s[500];
 5 void init()
 6 {
 7     for (int i = 0; i < n; ++i)
 8         s[i] = 'o';
 9     for (int i = n; i < 2 * n; ++i)
10         s[i] = '*';
11     for (int i = 2 * n; i < 2 * n + 2; ++i)
12         s[i] = '-';
13 }
14 void print()
15 {
16     for (int i = 0; i < 2 * n + 2; ++i)
17         putchar(s[i]);
18     puts("");
19 }
20 void move(int Begin, int End)
21 {
22     swap(s[Begin], s[End]);
23     swap(s[Begin + 1], s[End + 1]);
24     print();
25 }
26 string ans[4] = {"ooo*o**--*", "o--*o**oo*", "o*o*o*--o*", "--o*o*o*o*"};
27 int main()
28 {
29     cin >> n;
30     init();  // 初始化棋子
31     print(); // 第一行打印
32     int len = n;
33     while (1)
34     {
35         move(len - 1, len << 1);
36         // 中间o*与末尾的--交换
37         --len;
38         if (len == 3)
39             break;
40         move(len, len << 1); // 最右边的**与--交换
41     }
42     string tmp;
43     for (int i = 0; i < n - 4; ++i)
44         tmp += "o*";
45     for (int i = 0; i < 4; ++i)
46         cout << ans[i] << tmp << endl;
47 
48     return 0;
49 }