码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1920 Towers of Hanoi

时间:2014-07-22 23:02:14      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   2014   

OJ题目:click here~~

题目分析:三根柱子 , n个圆盘 。给一个汉诺塔的状态,求将所有盘挪到一个柱子上的最少步数,并给出是最后在哪个柱子上。

从给定状态到目标状态很复杂,但是从目标状态到给定的状态就很容易想了。将一个柱子上i个盘,挪到另一个柱子上,需要pow(2,i) - 1步。 显然,最后在的那个柱子,一定是所给状态下最大盘所在的柱子。接下来考虑第二大的盘,需要移动就移动。……详见代码注释。

AC_CODE

const int mod = 1000000;
int p[100002] , s[100002];
int   main(){
      int n  , i , j , k  ,a , x[4] ;
      s[0] = 1;
      for(i = 1;i <= 100000;i++)
         s[i] = 2*s[i - 1] , s[i] %= mod;
      while(cin >> n){
          scanf("%d%d%d",&x[1],&x[2],&x[3]);
          for(i = 1;i <= 3;i++)
          for(j = 0;j < x[i];j++){//记录所给状态每个盘在哪个柱子
            scanf("%d",&a);
            p[a] = i;
          }
          int now = p[n];
          int need = p[n - 1];
          int ans = 0;
          for(i = n - 1;i > 0;i-- , need = p[i]){
            if(need != now){//此刻的状态与需要的状态不一样,则需要移动
                ans += s[i - 1];//ans += (s[i - 1] - 1 + 1)
                ans %= mod;
                now = 6 - need - now;//盘i以上的所0有盘,先要挪到除这两个以外的第三个柱子上。
            }
          }
          cout << p[n] << endl << ans << endl;//最后所在的柱子,一定是最大盘在的柱子
      }
      return 0 ;
}


POJ 1920 Towers of Hanoi,码迷,mamicode.com

POJ 1920 Towers of Hanoi

标签:style   blog   http   color   strong   2014   

原文地址:http://blog.csdn.net/bolininahuaalex/article/details/24738629

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!