[导入]一个约瑟夫的变形

题目:
有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[i]=i+1;
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 < n; 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 ",a[i]);
       printf("%d\n",a[i]);
    }
   return 0;
}

( 网页浏览 )
文章来源:http://acm.tongji.edu.cn/people/kaikai/blog/blog.php?job=art&articleid=a_20041207_191333
原文地址:https://www.cnblogs.com/kaikai/p/77541.html