首页 > 代码库 > POJ 1920 Towers of Hanoi
POJ 1920 Towers of Hanoi
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 ; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。