機械人的運動範圍

2021-09-29 14:58:55 字數 1502 閱讀 1241

地上有乙個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...