Leetcode999:车的可用捕获量(java)

题目描述

在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。

示例 1:
在这里插入图片描述

输入:[[".",".",".",".",".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",“R”,".",".",".",“p”],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
在本例中,车能够捕获所有的卒。

示例 2:
在这里插入图片描述

输入:[[".",".",".",".",".",".",".","."],[".",“p”,“p”,“p”,“p”,“p”,".","."],[".",“p”,“p”,“B”,“p”,“p”,".","."],[".",“p”,“B”,“R”,“B”,“p”,".","."],[".",“p”,“p”,“B”,“p”,“p”,".","."],[".",“p”,“p”,“p”,“p”,“p”,".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:0
解释:
象阻止了车捕获任何卒。

示例 3:
在这里插入图片描述

输入:[[".",".",".",".",".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",“p”,".",".",".","."],[“p”,“p”,".",“R”,".",“p”,“B”,"."],[".",".",".",".",".",".",".","."],[".",".",".",“B”,".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
车可以捕获位置 b5,d6 和 f5 的卒。

提示:

1.board.length == board[i].length == 8
2.board[i][j] 可以是 ‘R’,’.’,‘B’ 或 ‘p’
3.只有一个格子上存在 board[i][j] == ‘R’

思路分析

其实题目的意思可以理解为移动一次吃到卒的方案有多少种。 所以就是先找到车的位置,然后从这个位置开始遍历上下左右4个方向,如果遇到了卒就res+1并退出循环,如果遇到了象或者出界了就退出循环。

代码实现

package LanqiaoVip;

public class NumRookCaptures {

	public static void main(String[] args) {
		char[][] board = { { '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', '.', 'p', '.', '.', '.', '.' },
				{ '.', '.', '.', 'R', '.', '.', '.', 'p' }, { '.', '.', '.', '.', '.', '.', '.', '.' },
				{ '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', '.', 'p', '.', '.', '.', '.' },
				{ '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', '.', '.', '.', '.', '.', '.' } };

		System.out.println(numRookCaptures(board));
	}

	public static int numRookCaptures(char[][] board) {
		// 定义上下左右四个方向
		int[] dx = { -1, 1, 0, 0 };
		int[] dy = { 0, 0, -1, 1 };

		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				// 找到白车所在的位置
				if (board[i][j] == 'R') {
					// 分别判断白车的上、下、左、右四个方向
					int res = 0;
					for (int k = 0; k < 4; k++) {
						int x = i, y = j;
						while (true) {
							x += dx[k];
							y += dy[k];
							if (x < 0 || x >= 8 || y < 0 || y >= 8 || board[x][y] == 'B') {
								break;
							}
							if (board[x][y] == 'p') {
								res++;
								break;
							}
						}
					}
					return res;
				}
			}
		}
		return 0;
	}
}

发布了88 篇原创文章 · 获赞 27 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/weixin_43362002/article/details/105117532