- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Program to Find Out the Number of Moves to Reach the Finish Line in Python
Suppose, we have a car and are driving it on a one−dimensional road. Currently we are at position = 0 and with speed = 1. We can perform any of these two operations.
Acceleration: position := position + speed and speed := speed * 2 Reverse Gear: speed := −1 when speed > 0 otherwise speed := 1.
We have to find the number of moves needed at least to reach the target.
So, if the input is like target = 10, then the output will be 7.
To solve this, we will follow these steps −
Define a function dfs() . This will take digit, cost, pos, neg, target
tot := cost + maximum of 2 *(pos − 1) and 2 * (neg − 1)
if tot >= ans, then
return
if target is same as 0, then
ans := minimum of ans and tot
return
step := (2^digit) − 1
if step * 2 < |target|, then
return
dfs(digit − 1, cost, pos, neg, target)
dfs(digit − 1, cost + digit, pos + 1, neg, target − step)
dfs(digit − 1, cost + digit * 2, pos + 2, neg, target − step * 2)
dfs(digit − 1, cost + digit, pos, neg + 1, target + step)
dfs(digit − 1, cost + digit * 2, pos, neg + 2, target + step * 2)
From the main function, do the following −
ans := infinity
hi := 1
while 2^hi < target, do
hi := hi + 1
dfs(hi, 0, 0, 0, target)
return ans
Let us see the following implementation to get better understanding −
Example
class Solution: def solve(self, target): self.ans = int(1e9) hi = 1 while (1 << hi) < target: hi += 1 self.dfs(hi, 0, 0, 0, target) return self.ans def dfs(self, digit, cost, pos, neg, target): tot = cost + max(2 * (pos − 1), 2 * neg − 1) if tot >= self.ans: return if target == 0: self.ans = min(self.ans, tot) return step = (1 << digit) − 1 if step * 2 < abs(target): return self.dfs(digit − 1, cost, pos, neg, target) self.dfs(digit − 1, cost + digit, pos + 1, neg, target − step) self.dfs(digit − 1, cost + digit * 2, pos + 2, neg, target − step * 2) self.dfs(digit − 1, cost + digit, pos, neg + 1, target + step) self.dfs(digit − 1, cost + digit * 2, pos, neg + 2, target + step * 2) ob = Solution() print(ob.solve(10))
Input
10
Output
7