算法实现——约瑟夫问题

约瑟夫环问题描述:

约瑟夫环问题起源于一个犹太故事。问题大意如下:
罗马人攻占了乔塔帕特,41个人藏在一个山洞中躲过了这场浩劫。其中包括了Josephus和他的一个朋友。剩余39人不想屈服罗马人,决定集体自杀。大家决定了一个自杀方案,由41个人组成一个圆圈,第一个人开始顺时钟报数,报数为三的人就马上自杀,然后由下一个人重新开始报数,仍然报数为3就自杀。。。。。直到所有人都死亡
输出他们的自杀顺序

思路:循环链表初始化、删除操作

本来以为是很简单的一道题,结果自己写的时候才知道,各种奇葩错误。伤不起啊,重现错误,以及修正过程,以此为鉴。

typedef struct node{
	int num;
	node* next;
} *pnode;
pnode initialize(int n){
	pnode head = new node;
	pnode pre=head;
	//head->next = 0;
	head->num = n;
	int i = 1;
	while (n){
		pnode p = new node;
		p->num = i;
		
		pre->next = p;
		pre = p;
		n--;
		i++;
	}
	pre->next = head->next;
	return head;
}
void yusefu(pnode head){
	int cnt = 1;
	int n = head->num;
	int *no = new int[head->num];
	pnode p = head->next;
	pnode pre=p;


	while (n){
		while (cnt!=3)
		{
		//	p = pre;
			pre = p;
			p = p->next;
			cnt++;
			cout << p->num <<"cnt"<<cnt<< endl;
		}
		cnt = 0;
		pre->next = p->next;
		no[head->num - n] = p->num;
		n--;
		delete p;
		p = pre;
	}
	
	for (int i = 0; i < head->num; i++){
		cout << no[i] << '\t';
		if (i == 10)cout << endl;
	}
	
	delete[]no;
}
int main(){
	// 约瑟夫环问题:
	cout << "约瑟夫环问题 input n" << endl;
	int n;
	cin >> n;
	pnode ph=initialize(n);
	yusefu(ph);
}

首先是初始化错误,第一次写的时候没注意,直接把各个node的num值设置成与n相等了,结果就是倒序的;后来调试的时候 解决;

其次函数yuesefu()里面,起初没有第6行,pre=p的赋值,导致编译器警告,后加上;再次运行,因为22行把p delete了,导致进入内层循环的时候,p指针内容无效,错误。自以为是地加上了第12行,以为这样就可以了,没有想到这才是噩梦的开始。

输出的结果怎么都是不对的,各种调试,各种检查,前前后后折腾了一个多小时,最后才恍然大悟,就因为加上了那一行,导致了本质上没有删除链表。最后终于找到原因了,但是不加又会报错,怎么办?终于灵机一动才想起来在23行加上。。。

哎,发现自己还是弱爆了。。。。。

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/lijunchengbeyond/article/details/25158799
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞