題目描述
地上有一個(gè)m行和n列的方格。一個(gè)機(jī)器人從坐標(biāo)0,0的格子開始移動(dòng),每一次只能向左,右,上,下四個(gè)方向移動(dòng)一格,但是不能進(jìn)入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。 例如,當(dāng)k為18時(shí),機(jī)器人能夠進(jìn)入方格(35,37),因?yàn)?+5+3+7 = 18。但是,它不能進(jìn)入方格(35,38),因?yàn)?+5+3+8 = 19。請問該機(jī)器人能夠達(dá)到多少個(gè)格子?
算法解析:從(0, 0)開始利用回溯法檢查四周的結(jié)點(diǎn)。
代碼如下:
public int movingCount(int threshold, int rows, int cols) { boolean[] visited = new boolean[rows * cols]; int count = movingCountCore(threshold, rows, cols, 0, 0, visited); return count; } public int movingCountCore(int threshold, int rows, int cols, int row, int col, boolean[] visited) { int count = 0; if (checkDigits(threshold, rows, cols, row, col, visited)){ visited[row * cols + col] = true; count = 1 + movingCountCore(threshold, rows, cols, row, col - 1, visited) + movingCountCore(threshold, rows, cols, row - 1, col, visited) + movingCountCore(threshold, rows, cols, row, col + 1, visited) + movingCountCore(threshold, rows, cols, row + 1, col, visited); } return count; } public boolean checkDigits(int threshold, int rows, int cols, int row, int col, boolean[] visited){ if (row >= 0 && row < rows && col >= 0 && col < cols && getDigitSum(row) + getDigitSum(col) <= threshold && !visited[row * cols + col]){ return true; } return false; } public int getDigitSum(int number){ int sum = 0; while (number > 0){ sum += number % 10; number /= 10; } return sum; }新聞熱點(diǎn)
疑難解答