1 条题解

  • 0
    @ 2026-6-19 10:30:30

    📝 题目大意

    在一个 8×88 \times 8 的棋盘上,列用字母 a~h(从左到右)编号,行用数字 1~8(从下到上)编号。给定 88 行字符串(从上到下),其中恰好有一个 * 表示棋子,其余为 .。输出棋子所在格子的棋盘坐标。

    💡 解题思路

    1. 题目分析:棋盘大小固定为 8×88 \times 8,且恰好只有一个 *,只需找到它并转换为棋盘坐标。数据范围极小,直接遍历即可。
    2. 算法推导
      • 读入的 SiS_i从上到下的行,而棋盘行号是从下到上递增的。
      • 设读入的行索引为 ii00 表示最上面一行),列索引为 jj00 表示最左边一列)。
      • 列号转换:第 jj 列对应字母 'a' + jj=0j=0 \rightarrow aj=7j=7 \rightarrow h)。
      • 行号转换:棋盘最下面一行为第 11 行,对应读入的 i=7i=7;最上面一行为第 88 行,对应 i=0i=0。因此行号 =8i= 8 - i
      • 遍历所有格子,找到 * 后输出 char('a' + j)8 - i,直接结束。
    3. 边界与细节:无特殊边界情况。注意输出格式为字母在前、数字在后,中间无空格。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),棋盘大小固定为 6464 个格子。
    • 空间复杂度O(1)O(1),仅存储 88 个长度为 88 的字符串。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
      vector<string> s(8);
      // 读入 8 行,s[0] 为最上面一行,s[7] 为最下面一行
      for (int i = 0; i < 8; i++) {
        cin >> s[i];
      }
      for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
          if (s[i][j] == '*') {
            // 列号:左起第 j 列对应字母 'a' + j
            // 行号:棋盘从下到上编号,输入从上到下,所以行号 = 8 - i
            cout << char('a' + j) << 8 - i << '\n';
            return 0;
          }
        }
      }
    }
    
    • 1

    信息

    ID
    698
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者