#include

#include


int result;

int layer;


typedef struct node

{

    unsigned int data;

    int layer;

    struct node * next;

} NODE, * LPNODE, * QUEUE;


QUEUE Queue (void)

{

    LPNODE startPoint = (LPNODE)malloc(sizeof(NODE));

    startPoint->next = NULL;

    

    return (QUEUE)startPoint;

}


void DeleteQueue (QUEUE queue)

{

    LPNODE currentNode = (LPNODE)queue->next;

    LPNODE nextNode = currentNode->next;

    

    while (currentNode->next != NULL)

    {

        free(currentNode);

        currentNode = nextNode;

        nextNode = nextNode->next;

    }

    

    free(queue);

    

    return;

}


void Push (unsigned int data, int layer, QUEUE queue)

{

    LPNODE currentNode = (LPNODE)queue;

    

    while (currentNode->next != NULL)

        currentNode = currentNode->next;

        

    currentNode->next = (LPNODE)malloc(sizeof(NODE));

    currentNode = currentNode->next;

    currentNode->data = data;

    currentNode->layer = layer;

    currentNode->next = NULL;

    

    return;

}


unsigned int Pop (QUEUE queue)

{

    LPNODE startPoint = (LPNODE)queue;

    LPNODE currentNode = NULL;

    unsigned int data;

    

    if (startPoint->next == NULL)

        return 0;

    

    if (startPoint->next->next == NULL)

    {

        data = startPoint->next->data;

        layer = startPoint->next->layer;

        free(startPoint->next);

        startPoint->next = NULL;

        return data;

    }

    

    currentNode = startPoint->next->next;

    data = startPoint->next->data;

    layer = startPoint->next->layer;

    free(startPoint->next);

    startPoint->next = currentNode;

    return data;

}


void search (unsigned int x, int layer, QUEUE queue)

{

    

    if (x <= 1)

    {

        result = layer;

        return;

    }

        

    if ((x % 3) == 0)

        Push(x / 3, layer + 1, queue);

        

    if ((x % 2 ) == 0)

        Push (x / 2, layer + 1, queue);

        

    Push (x - 1, layer + 1, queue);

    

    return;

}


int main (void)

{

    unsigned int input, tmp;

    QUEUE que = Queue();

    

    scanf ("%d", &input);

    

    Push(input, 0, que);

    

    while (!result)

    {

        tmp = Pop(que);

        search(tmp, layer, que);

    }

        

    printf("%d", result);

    

    DeleteQueue(que);

    

    return 0;

}


너무싫어