地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。 例如,當k為18時,機械人能夠進入方格(35,37),因為3+5+3+7 = 18。但是,它不能進入方格(35,38),因為3+5+3+8 = 19。請問該機械人能夠達到多少個格仔?
典型回溯法的問題
回溯法是一種深度優先搜尋方法
按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
演算法如下:
1、首先確定初始點,將初始點的行和列加入佇列中儲存
2、佇列不為空,彈出隊首元素
3、從隊首元素往上下左右搜尋,能夠滿足小於k,且未被搜尋過,加入佇列中
4、重複2、3
#pragma once
#include namespace movingcount
; public:
bool** _e;
int _threshold;
int _maxr;
int _maxc;
int _sum;
int movingcount(int threshold, int rows, int cols)
if (threshold < 0)
// 初始化表
_threshold = threshold;
_e = new bool* [rows];
_maxr = rows;
_maxc = cols;
for (int i = 0; i < rows; i++)
}std::queueque;
que.push(row_col);
_e[0][0] = true;
_sum = 1;
while (!que.empty())
return _sum;
} // 判斷節點是否滿足條件
bool satisfied(int row, int col, std::queue&que)
if (_e[row][col] == true)
int sum = sum_bit(row) + sum_bit(col);
if (sum <= _threshold)
);_sum++;
return true;
}return false;
} // 判斷個位數的和
int sum_bit(int row)
return ret;
} };
}
test.cpp
#pragma once
#include "movingcount.h"
namespace movingcount
}
機械人運動範圍
題目 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 1...
機械人運動範圍
地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 19。請...
機械人的運動範圍
題目 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 1...