别说这道题有毒
查看原帖
别说这道题有毒
316358
不知名用户楼主2020/5/7 06:44

大家第一个误区: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表示目标柱

咋输出我也不知道

2020/5/7 06:44
加载中...