using
System;
using
System.Collections.Generic;
class
Node
{
public
int
val;
public
int
moves;
public
Node(
int
v,
int
m)
{
val = v;
moves = m;
}
}
class
Program
{
static
int
MinMoves(
int
N)
{
HashSet<
int
>
set
=
new
HashSet<
int
>();
Queue<Node> q =
new
Queue<Node>();
set
.Add(0);
q.Enqueue(
new
Node(0, 0));
while
(q.Count > 0)
{
Node curr = q.Dequeue();
if
(curr.val == N)
{
return
curr.moves;
}
if
(!
set
.Contains(curr.val - 1))
{
set
.Add(curr.val - 1);
q.Enqueue(
new
Node(curr.val - 1, curr.moves + 1));
}
if
(!
set
.Contains(curr.val + 1))
{
set
.Add(curr.val + 1);
q.Enqueue(
new
Node(curr.val + 1, curr.moves + 1));
}
if
(!
set
.Contains(curr.val * 2))
{
set
.Add(curr.val * 2);
q.Enqueue(
new
Node(curr.val * 2, curr.moves + 1));
}
int
sqr = curr.val * curr.val;
if
(!
set
.Contains(sqr))
{
set
.Add(sqr);
q.Enqueue(
new
Node(sqr, curr.moves + 1));
}
if
(!
set
.Contains(-curr.val))
{
set
.Add(-curr.val);
q.Enqueue(
new
Node(-curr.val, curr.moves + 1));
}
}
return
-1;
}
static
void
Main(
string
[] args)
{
int
N = 50;
Console.WriteLine(MinMoves(N));
}
}