有n张牌,叠成一叠,
1:把第一张牌放到最后,把下一张牌放到桌面上打开,
2:再把第一张牌放到最后,把下一张打开放到桌面上,
依次重复1,2步骤,直到所有牌都打开,
这时的牌号是1,2,3,4,....,n;
http://www.ecchina.com/dispbbs.asp?boardid=3&id=17404&star=1#43913
kaikai:
最快的也要O(2N)了吧,
直接用一个数组。用数字 0..n-1 表示它的后继的下标
初始化:
Code: |
for(i=0; i < n; i++) a[n-1]=0; |
然后再按题目要求,依次访问结点,每访问到一个,需要将它的前驱内容改为它后继的下标
Code: |
p = 0; // 第一个的前驱是n-1号结点,此时直接跳过1个结点 i = 1; // 从第二个结点开始计算 for (d=1;d<=n;d++) { a[p] = a[i]; a[i] = d; p = a[p]; // 向后遍历2个结点 i = a[p]; } |
完整代码:
Code: |
#include #define N 100 int main() { int a[N]; int i,p,n,d; while(scanf("%d",&n)==1 && n) { if (n==1) { printf("1\n"); continue; } for( i=0; i a[i]=i+1; a[n-1]=0; p = 0; i = 1; for (d=1;d<=n;d++) { a[p] = a[i]; a[i] = d; p = a[p]; i = a[p]; } for (i=0;i printf("%d\n",a[i]); } return 0; } |
( 网页浏览 )
文章来源:http://acm.tongji.edu.cn/people/kaikai/blog/blog.php?job=art&articleid=a_20041207_191333