C++的学习之路---25

  一群小孩 围成一圈,任意假定一个数m,从第一个小孩起,按顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。
  今天这章我为大家讲解一下约瑟夫环的问题,上面就是这道题的例子。狗头!

直接上代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int main() {
	//n个小孩围成圆圈
	const int numofBoy = 30;	//小孩总数
	int boy[numofBoy];			//小孩数组

	int i;
	for (int i = 0; i < numofBoy; i++) {//从1开始给小孩编号
		boy[i] = i + 1;
	}
	//输入小孩的间隔
	int m;
	cout << " please input the interval: ";//间隔 
	cin >> m;
	//输出开始时的小孩编号
	for (i = 0; i < numofBoy; i++) {
		cout << boy[i] << ",";
	}
	cout << endl;

	//小孩依次离开
	i = 0;										//当前位置设置为第1个小孩

	int n = numofBoy;							//离开小孩的个数
	while (n > 1) {								//只剩一个小孩
		//数到第m个小孩离开
		int j = m;
		do
		{
			//当前位置i调整到下一个小孩
			i = (i + 1) % numofBoy;
			while (boy[i] == 0) {
				i = (i + 1) % numofBoy;
			}
			j--;								//输一个小孩
		} while (j > 1);						//数到第m个小孩

		//第m个小孩离开
		cout << boy[i] << ",";						//输出离开的小孩编号
		boy[i] = 0;									//标识该小孩离开

		//当前位置i调整到下一个小孩
		i = (i + 1) % numofBoy;
		while (boy[i] == 0) {
			i = (i + 1) % numofBoy;
		}
		n--;										//离开一个小孩
	}

	//宣布得胜者
	for (int i = 0; i < numofBoy; i++) {
		if (boy[i] != 0) {
			cout << "\n\nNo." << boy[i] << " 获胜.\n";	//输出获胜者
			break;
		}
	}
	return 0;

}

分析一下这个代码,这个代码适合初学者,但是C++小白就不要妄想了,请你们学习好基础再来学习这个问题。

这个代码并没有利用什么高级算法,只是简单的利用了最基础的数据结构---数组,来解决的,适合于C++新手来锻炼思维,在下一章,我会为大家讲解用vector来解决这件事。

Power!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值