题解
谜题
1 条题解
-
0
解题思路
这个谜题其实就是一个移动交换的模拟过程,我们只要照着指令一步步做就行。
第一步,先在 5×5 的网格里找到星号 * 现在在哪个格子,记下它的行号 x 和列号 y。
第二步,一条一条地执行指令,一共有 4 种:
- A:把星号往上移一行,行号 x 减 1;
- B:把星号往下移一行,行号 x 加 1;
- L:把星号往左移一列,列号 y 减 1;
- R:把星号往右移一列,列号 y 加 1。
每次移动,星号都会和它要去的那个格子交换内容:原来格子里的字母跑到星号原来的位置,星号跑到那个格子。所以移动后,格子里的字母就换了个位置,而星号跟着移动了一步。
题目保证指令都是合法的,不会让星号移出网格,所以不用担心越界。
第三步,把移动完的网格一行一行、一列一列地输出出来,每个字符之间用一个空格隔开。
参考代码
// P4518 谜题:在5x5网格中根据指令移动星号,与相邻格子交换 #include <iostream> using namespace std; int main() { char g[5][5]; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) cin >> g[i][j]; char s[6]; cin >> s; // 找到星号的位置 int x = 0, y = 0; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (g[i][j] == '*') { x = i; y = j; } // 逐条执行指令 for (int k = 0; s[k]; k++) { int nx = x, ny = y; if (s[k] == 'A') nx--; // A:向上移动一行 else if (s[k] == 'B') nx++; // B:向下移动一行 else if (s[k] == 'L') ny--; // L:向左移动一列 else if (s[k] == 'R') ny++; // R:向右移动一列 // 星号与目标格子的内容交换 char t = g[x][y]; g[x][y] = g[nx][ny]; g[nx][ny] = t; x = nx; y = ny; } for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (j) cout << ' '; cout << g[i][j]; } cout << endl; } return 0; }复杂度分析
网格固定是 5×5,指令固定是 5 条,所以无论做什么操作,次数都是常数,时间复杂度是 O(1),空间复杂度也是 O(1)。
- 1