( jiao @wlcj zuo de di yi ti )
QUESTION:
一副牌,序号从1到n,每次从牌堆顶部拿出一张牌放在桌子上,并将下一张牌放到牌堆底,依次循环,最终在桌子上的牌从1到n的有序。设计程序实现。
先小范围模拟一下:
假设n=6;即6张牌。
设t是开始的牌堆, s是桌上的牌
开始
t { 1 2 3 4 5 6 } s { }
这里一步步模拟
t { 2 3 4 5 6 } s { 1 }
t { 3 4 5 6 2 } s { 1 }
t { 4 5 6 2 } s { 1 3 }
t { 5 6 2 4 } s { 1 3 }
t { 6 2 4 } s { 1 3 5 }
t { 2 4 6 } s { 1 3 5 }
t { 4 6 } s { 1 3 5 2 }
t { 6 4 } s { 1 3 5 2 }
t { 4 } s { 1 3 5 2 6 }
t { 4 } s { 1 3 5 2 6 }
t { } s { 1 3 5 2 6 4 }
即 t { 1 2 3 4 5 6 } -----------------------> s { 1 3 5 2 6 4 }
可以看到
1 ---> s[1]
2 ---> s[4]
3 ---> s[2]
4 ---> s[6]
5 ---> s[3]
6 ---> s[5]
这个数组里的值不管如何变, t->s的映射都是一样的 他们的位置变化都是固定的。
这样就有一个思路可以逆过来想:
假设我们已经知道
结果数组s的值为 s { 1 2 3 4 5 6 } (即最后桌面上牌是有序的)
那么 。。根据上面的映射关系
那么是否可以推出 t { x x x x x x } ---> s { 1 2 3 4 5 6 } 呢?
肯定是可以的,来捋一捋这玩意到底该怎么变化。
简单的做法,即将下标和值交换位置就可以了。
t[s[1]] = 1
t[s[2]] = 2
t[s[3]] = 3
t[s[4]] = 4
t[s[5]] = 5
t[s[6]] = 6
ps:注意这个s的值还是上面的 s { 1 3 5 2 6 4 }
即!
t {1 4 2 6 3 5 } 出来了
OJBK