13.ロボットの顔の質問の移動範囲LeetCode
一つの質問、毎日適度な難易度2020年4月8日
タイトル
グランドの座標から、m行n列を市松[0,0]
座標[m-1,n-1]
。ロボットの座標から[0, 0]
それぞれ左缶グリッドスタートを移動、右、上及び(例外側に移動しない)グリッドの上下動、グリッドの行および列の座標を入力することができない、ビットkの数の合計よりも大きいです。kが18である場合、例えば、ロボットが3 + 3 + 5 + 7 = 18は、[35、37]ボックスに入力することができます。それは3 + 3 + 5 + 8 = 19は、ボックス[35、38]を入力することはできません。ロボットは、格子の数に到達することができるだろうか?
例1:
输入:m = 2, n = 3, k = 1
输出:3
例1:
输入:m = 3, n = 1, k = 0
输出:1
ヒント:
1 <= n,m <= 100
0 <= k <= 20
問題の解決策
ここでは、私たちが行くことができるすべての場所を検索するための幅優先探索(BFS)を使用することができ、それぞれがキューに追加して、以下の場所に来て、行、列の現在の位置に合わせて、あなたKまたはすることができますそしてANS ++。ここでは、我々は[0,0]で起動するのでANS初期値は、1に設定されている必要がある、それは確かにアクセスすることが可能です。我々は、キューを作成し、レコード行、列に構造を作成することでqueue<ds>
アクセスが追加された場合、私たちの残りのノードは、4つの方向がアクセスできる表示するダウンアクセスし、順次各ノードにアクセスし、格納することができキュー、およびANS ++。全体の訪問が終了した後、ANSは私たちの答えです。
class Solution {
typedef struct{
int row;
int col;
}ds;
public:
int movingCount(int m, int n, int k) {
//默认为1,即(0,0)
int ans = 1;
//方向数组
int dir[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
bool visit[m][n];
memset(visit,false,sizeof(visit));
visit[0][0] = true;
queue<ds> store;
ds temp = {0,0};
store.push(temp);
while(store.size()){
ds now = store.front();
store.pop();
for(int i = 0; i < 4; i++){
if((now.row + dir[i][0] >= 0) && (now.row + dir[i][0] < m) && (now.col + dir[i][1] >= 0) && (now.col + dir[i][1] < n) && (visit[now.row + dir[i][0]][now.col + dir[i][1]] == false)){
int sum_number,temp_x;
sum_number = 0;
// 计算行的位数和
temp_x = now.row + dir[i][0];
while(temp_x){
sum_number += temp_x % 10;
temp_x /= 10;
}
// 计算列的位数和
temp_x = now.col + dir[i][1];
while(temp_x){
sum_number += temp_x % 10;
temp_x /= 10;
}
if(sum_number <= k){
// 满足条件,小于等于k时,加入队列,ans++
ds temp = {now.row + dir[i][0],now.col + dir[i][1]};
store.push(temp);
visit[now.row + dir[i][0]][now.col + dir[i][1]] = true;
ans++;
}
}
}
}
return ans;
}
};
実行効率: