題目鏈接:
題目描述:
在一個 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 的卒。
提示:
board.length == board[i].length == 8
board[i][j]
可以是'R'
,'.'
,'B'
或'p'
- 只有一個格子上存在
board[i][j] == 'R'
思路:
這道題很無聊,一句話形容這道題目:老太太的裹腳布——又臭又長。
題目本身非常簡單,但是題目描述讓人一言難盡。
題目的意思是,棋盤中有一個“車”,問“車”向上下左右四個方向遍歷能喫到多少個“卒”。條件是:
- 不能出棋盤;
- 遇到“象”不通;
- 一旦喫到“卒”了,這個方向上的遍歷就結束了。
一旦描述清楚,題目就變得非常簡單了。也懶得想了,直接簡單粗暴吧。
class Solution {
public int numRookCaptures(char[][] board) {
// 結果數
int count = 0;
// 車的座標
int rooki = 0, rookj = 0;
// 找到車的位置
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
// 題目中已經說明只有一個“車”,所以一旦找到就可以終止尋找了。
// 但棋盤只有8*8,跳不跳循環也沒啥區別。
if (board[i][j] == 'R') {
rooki = i;
rookj = j;
}
}
}
// 向左
for (int j = rookj; j >= 0; j--) {
if (board[rooki][j] == 'B') {
break;
}
if (board[rooki][j] == 'p') {
count ++;
break;
}
}
// 向右
for (int j = rookj; j < board[rooki].length; j++) {
if (board[rooki][j] == 'B') {
break;
}
if (board[rooki][j] == 'p') {
count ++;
break;
}
}
// 向上
for (int i = rooki; i >= 0; i--) {
if (board[i][rookj] == 'B') {
break;
}
if (board[i][rookj] == 'p') {
count ++;
break;
}
}
// 向下
for (int i = rooki; i < board.length; i++) {
if (board[i][rookj] == 'B') {
break;
}
if (board[i][rookj] == 'p') {
count ++;
break;
}
}
return count;
}
}