/**************************************************************************
Author:
Date:[]
Description:约瑟夫环,n个人围成一个圈,从1开始报数,第m个人出局,下一个人继续报数,直到最后一个人
**************************************************************************/
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class JosephProblem : MonoBehaviour
{
public Data data;
/// <summary>
/// 源数据列表
/// </summary>
public List<int> sourceList;
/// <summary>
/// 结果数据列表
/// </summary>
public List<int> resultList;
public Text duiLie;
public Text chuJu;
public InputField TotalCountInputField;
public InputField StartInputField;
public InputField SelectedInputField;
void Init()
{
sourceList = new List<int>();
resultList = new List<int>();
data.TotalCount =int.Parse( TotalCountInputField.text);
data.Start = int.Parse(StartInputField.text);
data.Selected = int.Parse(SelectedInputField.text);
for (int i = 0; i < data.TotalCount; i++)
{
sourceList.Add(i + 1);
}
}
public void Do()
{
StopAllCoroutines();
Init();
StartCoroutine(DoWork());
}
public IEnumerator DoWork()
{
//列表的角标,用于操作源数据列表中的数据
int index = data.Start - 1;
//计数,当计到Selected的值时,出列一个数,然后重新开始计数
int count = 1;
while (sourceList.Count > 0)
{
if (count % data.Selected == 0)
{
resultList.Add(sourceList[index]);
sourceList.Remove(sourceList[index]);
duiLie.text = string.Join(",", sourceList.ConvertAll<string>(x => x.ToString()).ToArray());
chuJu.text = string.Join(",", resultList.ConvertAll<string>(x => x.ToString()).ToArray());
//this.ShowSourecData();
//this.ShowResultData();
count = 1;
}
else
{
count++;
index++;
}
//当循环完源数据列表中的所有数据时,重头开始再次循环
if (index == sourceList.Count)
index = 0;
yield return null;
}
}
}
[System.Serializable]
public class Data
{
/// <summary>
/// 总数
/// </summary>
public int TotalCount;
/// <summary>
/// 从第几个数开始
/// </summary>
public int Start;
/// <summary>
/// 第几个数出列
/// </summary>
public int Selected;
}