您的位置:首页 > 其它

poj 3572 Hanoi Tower

2016-01-22 15:53 274 查看

Hanoi Towers

Time Limit : 10000/5000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 0 Accepted Submission(s) : 0
Special Judge
[align=left]Problem Description[/align]

The “Hanoi Towers” puzzle consists of three pegs (that we will name A, B, and C) with n disks of different diameters stacked onto the pegs. Initially all disks are stacked onto peg A with the smallest disk at the top and the largest one at the bottom, so that they form a conical shape on peg A.



[align=left]Input[/align]

The input file contains two lines. The first line consists of a single
integer number n (1 ≤ n ≤ 30) the number of disks in the puzzle.
The second line contains descriptions of six moves separated by spaces the
strategy that is used to solve the puzzle.

[align=left]Output[/align]

Write to the output file the number of moves it takes to solve the puzzle.
This number will not exceed 1018.

[align=left]Sample Input[/align]

#13
AB BC CA BA CB AC
#22
AB BA CA BC CB AC
[align=left]Sample Output[/align]

#17
#25
貌似是一道纯规律的题,我不会做。。。照着网上的规律敲了一遍,感觉网上的大神真厉害。

题意:对于一个汉诺塔,每次按照给定的顺序,找第一个可以移动的方式去移动。要求不能大的下面放小的,且不能连续两次移动同一个盘子。

附上代码:

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll a[40],b[40],c[40];
int num[10];
char s[10];
int main()
{
int n,i,j,k;
a[1]=b[1]=c[1]=1;
for(i=2; i<=30; i++)
{
a[i]=a[i-1]*2+1;
c[i]=c[i-1]*3+2;
b[i]=b[i-1]+c[i-1]+1;
}
scanf("%d",&n);
for(i=1; i<=6; i++)
{
scanf("%s",s);
k=(s[0]-'A')*4+s[1]-'A';
num[k]=i;
}
if(num[1]<num[2])
{
if(num[4]<num[6])
printf("%I64d\n",c
);
else if(num[9]<num[8])
printf("%I64d\n",b
);
else
printf("%I64d\n",a
);
}
else
{
if(num[8]<num[9])
printf("%I64d\n",c
);
else if(num[6]<num[4])
printf("%I64d\n",b
);
else
printf("%I64d\n",a
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: