一个很老的递归

15个A,15个B,组成一环.从1数到9,9那个出去,下面接着数,要15个A出去,留下B,B应该怎样站

   int falg;//一轮最后一个9的倍数的坐标
        string temp = "";//一轮后9的倍数
        int l;//数组长度
        string[] temps = null;//一轮后9的倍数
        protected void Page_Load(object sender, EventArgs e)
        {
            List<int> arr = new List<int>();
            for (int i = 0; i < 30; i++)
            {
                arr.Add(i + 1);
            }        
         
            Arr(0, arr);
            foreach (int a in arr)
            {
                Response.Write(a + "  ");
            }
        }

        private void Arr(int p, List<int> arr)
        {
             temp = "";
             l = arr.Count;
            for (int i = 0; i < l; i++)
            {
                if (( i + p+1 ) % 9 == 0)
                {                  
                    temp += arr[i].ToString() + " ";
                    falg = i;
                }
                if (i == l - 1&&arr.Count >15)//到了最后一个了
                {
                     temps = temp.Trim ().Split(' ');                  
                    for (int j = temps.Length - 1; j >= 0; j--)
                        arr.Remove(Convert.ToInt32(temps[j]));
                    Arr(l-falg-1, arr);
                }
            }
        }

 

比较简单的方法

class Program
    {
        static void Main(string[] args)
        {
            //一开始有30个人
            int[] list = new int[30];
            //初始化每个人的原始位置
            for(int i = 0 ;i<30;i++)
            {
                list[i] = i;
            }
            // round_count 记录每次还剩下多少人 第一次 30人
            int round_count = 30;
            //记录最后一次是在哪个所以位置开始数
            int last_index = 0;
            for (int i = 0; i < 15; i++)
            {
                //更新队列人数
                round_count = 30 - i;
                //更新初始位置
                last_index = (last_index + 8) % round_count;
                //未被踢人位置前移
                for (int k = last_index; k < round_count - 1; k++)
                {
                    //移动后改变初始索引
                    list[k] = list[k + 1];
                }
            }
            //输出
            for (int i = 0; i < 15; i++)
            {
                Console.WriteLine(list[i]);
            }
            Console.ReadKey();
        }

 

//修改了下

  public partial class ck : System.Web.UI.Page
    {
        int index;
        protected void Page_Load(object sender, EventArgs e)
        {
            List<int> arr = new List<int>();
            for (int i = 0; i < 30; i++)
            {
                arr.Add(i + 1);
            }

            Arr(0, arr);
            foreach (int a in arr)
            {
                Response.Write(a + "  ");
            }
        }
      
        private void Arr(int p, List<int> arr)
        {         
            l = arr.Count;
            index = ( p + 8 ) % l;//以当前为0,找第8个就删除
            arr.Remove(arr[index]);
            if (arr.Count > 15)
            {
                Arr(index, arr);
            }
        }

   
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值