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);
}
}
}