Leecode刷题C语言之可以被进一步捕获的棋子数

发布于:2024-12-07 ⋅ 阅读:(160) ⋅ 点赞:(0)

执行结果:通过

执行用时和内存消耗如下:

 

 

 

代码如下: 

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'表示)的数量。代码的实现思路如下:

  1. 初始化变量
    • cnt:用于记录车能够捕获的兵的数量,初始化为0。
    • sted:用于存储找到的车的行和列位置,初始化为0。
    • dxdy:用于表示四个方向的数组,dx表示行变化(0, 1, 0, -1),dy表示列变化(1, 0, -1, 0),这四个方向分别是右、下、左、上。
  2. 找到车的位置
    • 遍历整个棋盘(8x8),寻找字符为'R'的位置,即车的位置。找到后,将车的行和列位置分别存储在sted中,并退出循环。
  3. 计算捕获的兵的数量
    • 遍历四个方向(右、下、左、上),对每个方向:
      • 使用一个步长变量step,从车的位置开始,沿当前方向逐步移动。
      • 计算新的位置(tx, ty),即tx = st + step * dx[i]ty = ed + step * dy[i]
      • 检查新位置是否越界或遇到黑方棋子('B'),如果是,则停止当前方向的搜索。
      • 如果新位置是兵('p'),则增加cnt(表示捕获了一个兵),并停止当前方向的搜索。
  4. 返回结果
    • 返回cnt,即车能够捕获的兵的总数。

注意

  • 该代码假设棋盘上只有一个车('R'),并且只计算该车能捕获的兵的数量。
  • 棋盘上的字符'B'代表黑方棋子(包括黑方的车和兵等),'p'代表兵(不考虑颜色,只关心是兵即可),'R'代表车。
  • 棋盘的大小固定为8x8,即boardSize为8,且每行的列数相同,存储在boardColSize中,但在这个函数中并未直接使用boardColSize,因为棋盘大小是固定的。

网站公告

今日签到

点亮在社区的每一天
去签到