NOJ 1541 加1乘2平方

2016.11.3

【題目描述】
1541.加1乘2平方

時限:1000ms 內存限制:10000K 總時限:3000ms

描述
給定兩個正整數m、n,問只能做加1、乘2和平方這三種變化,從m變化到n最少需要幾次

輸入
輸入兩個10000以內的正整數m和n,且m小於n
輸出
輸出從m變化到n的最少次數

輸入樣例
1 16
輸出樣例
3

【解題思路】
BFS,從當前節點擴展狀態加入隊列中,直到出現目標狀態

【代碼實現】

# include <iostream>
# include <queue>

using namespace std;

int m, n, num;
int used[100005];
queue<int> q;

void init(void);
int bfs(void);
int moveto(int ,int );

int main(void)
{
    cin >> m >> n;

    init();
    num = bfs();

    cout << num << endl;

    return 0;
}

int bfs(void)
{
    int i, t, k;

    while (!q.empty())
    {
        t = q.front();
        q.pop();
        for (i = 1; i <= 3; ++i)
        {
            k = moveto(t, i);
            if (k > n)
                continue;
            if (k == n)
                return used[t] + 1;
            if (used[k] == -1) 
            {
                used[k] = used[t] + 1;
                q.push(k);
            }
        }
    }
}

void init()
{
    int i;

    for (i = 1; i <= 10000; ++i)
        used[i] = -1;
    q.push(m);
    used[m] = 0;
}

int moveto(int a, int b)
{
    if (b == 1)
        return a * a;
    else if (b == 2)
        return a + 1;
    else
        return a * 2;
}

【心得體會】
學會STL中隊列的使用

發佈了48 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章