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
相关产品推荐
相关产品推荐

