You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

getRookMove函数第二个循环输出d5原因及重复ASCII转换疑问

Codeforces 1907A 代码疑问解答

以下是用于解决Codeforces 1907A问题的C++代码:

#include <iostream>
#include <string>

using namespace std;

const int BOARD_SIZE = 8;

void getRookMove(char StartingColumn, int StartingRow) {

    cout << endl;

    for(char ch = 'a'; ch <= 'h'; ch++) {
        if(ch != StartingColumn) {
            cout << ch << StartingRow << endl;
        }
    }

    for(int i = 1; i <= BOARD_SIZE; i++) {
        if(i != StartingRow - '0') {
            cout << StartingColumn << i << endl;
        }
    }
}

int main() {

    int t;
    cin >> t;

    while(t--) {
        
        string startingPosition;
        cin >> startingPosition;

        getRookMove(startingPosition[0], startingPosition[1] - '0');
    }

    return 0;
}

疑问列表

  • 为何getRookMove函数的第二个for循环会打印出"d5"?
  • 明明在main函数中已经通过ASCII转换将字符串中的行号转为整数传入该函数,为何第二个for循环的if判断里还要执行StartingRow - '0'的操作?

解答

1. 关于第二个for循环打印"d5"的问题

假设输入的起始位置是d5,此时StartingRow在main函数中已经被转换为整数5。但第二个for循环的判断条件i != StartingRow - '0'会计算5 - 48 = -43('0'的ASCII值是48)。由于遍历的i范围是1到8,所有值都不等于-43,循环会输出当前列(d)加上所有1-8的行号,自然包含了起始位置d5。这是逻辑错误导致本该排除的起始行号未被排除,所以错误打印出了起始坐标。

2. 关于多余的StartingRow - '0'操作

这是一个明显的代码错误。main函数调用getRookMove时,已经将startingPosition[1] - '0'的结果(整数类型的行号)传给了StartingRow参数。函数内部的if判断重复执行StartingRow - '0'完全没有必要,还会导致数值错误——整数减去字符'0'的ASCII值会得到负数,和遍历的i(1-8)永远不相等,进而引发第一个问题中的错误输出。

正确的判断条件应该改为if(i != StartingRow),这样就能跳过起始行号,只输出当前列下其他行的位置。


内容的提问来源于stack exchange,提问作者Ayubur Rahman Tashdid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:32:20