生活随笔
收集整理的這篇文章主要介紹了
跳石板(详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
https://www.nowcoder.com/practice/4284c8f466814870bae7799a07d49ec8?tpId=85&&tqId=29852&rp=1&ru
題目分析:
這道題就是計算從N開始加,最少加幾次等于M,前提條件是每次相加的數必須是當前數的約數
思路分析:
將M個石板看做一個保存結果的數組jumpNum,每個jumpNum[i]中都儲存著從N到當前位置最小的步數,如果是0,則說明不能走到這個位置。從起點開始對jumpNum進行遍歷,先求當前位置的所有約數也就是當前位置可以向前走的步數,然后更新到能到達的位置的最小步數。之前沒有來過這個位置,就將該位置更新為當前步數+1,否則更新為之前的步數和當前步數+1兩者最小的,經過遍歷一一次后得到結果,jumpNum[M]就是從N開始加,加到M的最少次數,如果是0,說明不可能加到M。
圖解思路:
上代碼:
#include<iostream>
#include<vector>
#include<algorithm>using namespace std
;
void divisorNum(int n
, vector
<int>& divNum
)
{for (int i
= 2; i
<= sqrt(n
); i
++){if (n
%i
== 0){divNum
.push_back(i
);if (n
/ i
!= i
)divNum
.push_back(n
/ i
);}}
}
int Jump(int N
, int M
)
{vector
<int>stepNum(M
+ 1, 0);stepNum
[N
] = 1;for (int i
= N
; i
< M
; i
++){vector
<int>divNum
;if (stepNum
[i
] == 0)continue;divisorNum(i
, divNum
);for (int j
= 0; j
<divNum
.size(); j
++){if ((divNum
[j
] + i
) <= M
&& stepNum
[divNum
[j
] + i
] != 0)stepNum
[divNum
[j
] + i
] = min(stepNum
[divNum
[j
] + i
], stepNum
[i
] + 1);else if((divNum
[j
] + i
) <= M
)stepNum
[divNum
[j
] + i
] = stepNum
[i
] + 1;}}for (int i
= 0; i
< stepNum
.size(); ++i
){cout
<< stepNum
[i
] << "->";}cout
<< endl
;if (stepNum
[M
] == 0)return-1;elsereturn stepNum
[M
] - 1;
}
int main()
{int n
, m
;cin
>> n
>> m
;cout
<< Jump(n
, m
) << endl
;return 0;
}
總結
以上是生活随笔為你收集整理的跳石板(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。