UVA 10795

来源:互联网 发布:php redis缓存周期 编辑:程序博客网 时间:2024/06/07 04:00

题意:
  汉诺塔问题。有n个盘子,放在3个盘子上,给你一个初始状态和一个结束状态,问你从初始状态转移到结束状态的最小步数。
思路:
  抓住中间状态,两边往中间走。
  

#include <bits/stdc++.h>using namespace std;typedef long long LL;int s[105], f[105];LL solve(int pos[], int k, int target)//把前k-1个放到另一个柱子上所需的最少步数。{    if(k == 0)    return 0;    if(pos[k] == target)  return solve(pos, k - 1, target);    //如果不相同要把前k-1个放到中间一根柱子other上。那形成的局面就是solve(*,*,*),    //然后再把第k个扔到target上,就是1,然后把other上的k-1歌扔到target柱子上就是2^(k - 1) - 1    return solve(pos, k - 1, 6 - pos[k] - target) + (1LL << (k - 1));}int main(){    int n, cas = 1;    while(~scanf("%d", &n))    {        if(n == 0)  break;        for(int i = 1; i <= n; i++) scanf("%d", &s[i]);        for(int i = 1; i <= n; i++) scanf("%d", &f[i]);        while(n >= 1 && s[n] == f[n])   n--;        LL ans = 0;        if(n >= 1)        {            int other = 6 - s[n] - f[n];            ans = solve(s, n - 1, other) + solve(f, n - 1, other) + 1;        }        printf("Case %d: %lld\n", cas++, ans);    }    return 0;}