执行结果:通过
执行用时和内存消耗如下:
代码如下:
int numRookCaptures(char** board, int boardSize, int* boardColSize) {int cnt = 0, st = 0, ed = 0;int dx[4] = {0, 1, 0, -1};int dy[4] = {1, 0, -1, 0};for (int i = 0; i < 8; ++i) {for (int j = 0; j < 8; ++j) {if (board[i][j] == 'R') {st = i;ed = j;break;}}}for (int i = 0; i < 4; ++i) {for (int step = 0; ; ++step) {int tx = st + step * dx[i];int ty = ed + step * dy[i];if (tx < 0 || tx >= 8 || ty < 0 || ty >= 8 || board[tx][ty] == 'B') {break;}if (board[tx][ty] == 'p') {cnt++;break;}}}return cnt;
}
解题思路:
这段代码的目的是计算在国际象棋棋盘上,给定一个局面,一个车(Rook)能够捕获(将军)的白方或黑方的兵(pawn,用'p'表示)的数量。代码的实现思路如下:
- 初始化变量:
cnt
:用于记录车能够捕获的兵的数量,初始化为0。st
和ed
:用于存储找到的车的行和列位置,初始化为0。dx
和dy
:用于表示四个方向的数组,dx
表示行变化(0, 1, 0, -1),dy
表示列变化(1, 0, -1, 0),这四个方向分别是右、下、左、上。
- 找到车的位置:
- 遍历整个棋盘(8x8),寻找字符为'R'的位置,即车的位置。找到后,将车的行和列位置分别存储在
st
和ed
中,并退出循环。
- 遍历整个棋盘(8x8),寻找字符为'R'的位置,即车的位置。找到后,将车的行和列位置分别存储在
- 计算捕获的兵的数量:
- 遍历四个方向(右、下、左、上),对每个方向:
- 使用一个步长变量
step
,从车的位置开始,沿当前方向逐步移动。 - 计算新的位置
(tx, ty)
,即tx = st + step * dx[i]
和ty = ed + step * dy[i]
。 - 检查新位置是否越界或遇到黑方棋子('B'),如果是,则停止当前方向的搜索。
- 如果新位置是兵('p'),则增加
cnt
(表示捕获了一个兵),并停止当前方向的搜索。
- 使用一个步长变量
- 遍历四个方向(右、下、左、上),对每个方向:
- 返回结果:
- 返回
cnt
,即车能够捕获的兵的总数。
- 返回
注意:
- 该代码假设棋盘上只有一个车('R'),并且只计算该车能捕获的兵的数量。
- 棋盘上的字符'B'代表黑方棋子(包括黑方的车和兵等),'p'代表兵(不考虑颜色,只关心是兵即可),'R'代表车。
- 棋盘的大小固定为8x8,即
boardSize
为8,且每行的列数相同,存储在boardColSize
中,但在这个函数中并未直接使用boardColSize
,因为棋盘大小是固定的。