编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序输出出列顺序
- //约瑟夫环问题
- typedef struct _JoinsItem
- {
- int date;
- bool deleted;
- } JoinsItem;
- JoinsItem *g_joinsItem;
- void initJoins(int maxLen)
- {
- g_joinsItem = new JoinsItem[maxLen];
- int i=0;
- for (i=0; i<maxLen; i++)
- {
- g_joinsItem[i].date = i+1;
- g_joinsItem[i].deleted = false;
- }
- }
- void uinitJoins()
- {
- delete [] g_joinsItem;
- }
- bool showJoins(int maxLen, int setLen, int begin = 0)
- {
- int i=0, j=0;
- int index=begin;
- int indexTmp = 0;
- for (i=0; i<maxLen; i++)
- {
- for (j=0; j<setLen; j++)
- {
- indexTmp = (index+1)%maxLen;
- while (g_joinsItem[indexTmp].deleted)
- {
- index++;
- indexTmp = (index+1)%maxLen;
- }
- index = indexTmp;
- }
- printf("%d ", g_joinsItem[index].date);
- g_joinsItem[index].deleted = true;
- }
- return true;
- }
- int main()
- {
- initJoins(6);
- showJoins(6, 4, 1);
- uinitJoins();
- }