生活随笔
收集整理的这篇文章主要介绍了
跳石板(详解)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
题目链接:
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;
}
总结
以上是生活随笔为你收集整理的跳石板(详解)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。