大家第一个误区:A盘a柱移到b柱把小于A盘的盘子集合到c柱再把A盘移到b柱
如#11输入
3
1 3
0
2 2 1
2 2 1
0
1 3
错误(就是误区)
move 1 from C to A
move 2 from C to B
move 1 from A to B
move 3 from A to C
move 1 from B to C
move 2 from B to A
move 1 from C to A
7
正确
move 3 from A to B
move 1 from C to B
move 2 from C to A
move 1 from B to A
move 3 from B to C
5
这是抄@学委
https://www.luogu.com.cn/discuss/show/46798
所以有人说#11有毒
改进
也可以小于A盘的盘子集合到b柱之后A盘移到c柱再把小于A盘的盘子集合到a柱最后A盘移到b柱
比较两种方法
1~A盘移到s柱
粗略写一下
for(int i=a;i>0;i++) move a to s;
move就是用两种方法选择次数少的方法
就第一次很难,之后集中到一个柱子是很好办的
之后就尽情用第一种方法
void mov(int n,char a,char c,char b) {
if(n==0) return;
mov(n-1,a,b,c);
k++;
printf("step %d %c->%c\n", k, a, c);
mov(n-1,b,c,a);
}
a表示当前柱,c表示目标柱
咋输出我也不知道