题目链接:传送门

题目大意:

汉诺塔,给定n个盘子(n <= 45),起始状态和结束状态,求最小的步数以及路径。

思路:

考虑用dfs贪心地将剩余最大盘归位。

#include<bits/stdc++.h>

using namespace std;
const int MAX_N = 50;
const int SUM = 3;

int N, ans;
int f1[MAX_N], f2[MAX_N];

void dfs(int cur, int st, int ed, bool now)
{
    int mid = SUM - st - ed;
    if (st == ed) {
        if (cur > 1)
            dfs(cur-1, f1[cur-1], now ? f2[cur-1] : ed, now);
        return;
    }
    if (cur > 1)
        dfs(cur-1, f1[cur-1], mid, false);
    ans++;
    printf("move %d from %c to %c\n", cur, 'A' + st, 'A' + ed);
    f1[cur] = ed;
    if (cur > 1)
        dfs(cur-1, f1[cur-1], now ? f2[cur-1] : ed, now);
}

void input()
{
    ans = 0;
    cin >> N;
    for (int i = 0; i < 6; i++) {
        int x;
        cin >> x;
        while (x--) {
            int cur;
            cin >> cur;
            if (i/3)
                f2[cur] = i%3;
            else
                f1[cur] = i%3;
        }
    }
}

int main(){
    input();
    dfs(N, f1[N], f2[N], true);
    cout << ans << endl;
    return 0;
}
View Code

相关文章: