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


    题目:
    有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
  • 相关阅读:
    php
    图片拖拽
    12.20
    正则详细讲解
    12.19
    正则
    闭包
    date类
    二分查找
    冒泡排序
  • 原文地址:https://www.cnblogs.com/kaikai/p/77541.html
Copyright © 2020-2023  润新知