您的位置:首页 > 其它

约瑟夫问题

2009-09-01 20:31 190 查看
题目:古代某法官要判决n个犯人死刑,他有一条荒唐的逻辑,将犯人首尾相接排成圆圈,然后从第s个人开始数起,每数到第m个犯人,就拉出来处决,然后又数m个,数到的犯人又拉出来处决,依次类推。剩下的最后一个人可以赦免。

分析:当热用循环链表和队列都可以实现,下面虽然没有直接引用,但也没有离开它们的影子。用字符串表示所有犯人,主要三个指针,一个记录下次开始数起的地址*jilu,一个执行遍历实现数的过程*w,一个字符串常量指针*temp记录删除一个字符后的字符串。

最要控制好遇到‘/0’时的指针跳转。由于用的是计事本所以格式不好控制

代码如下:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

void findkill(char *p,int s,int m)

{

//temp记录去掉一个字符的字符串

char *temp=(char *)malloc(strlen(p));

char *w,kill,*jilu;

jilu=&p[s-1];//记录重新开始数的地址

int i,j;

while(strlen(p)>0)

{

if(strlen(p)==1)

{

printf("the man is not killed!/n");

printf("%s/n",p);

break;

}

else

{

w=jilu;

for(i=0;i<m;i++)

{

if(*w=='/0')

{

w=p;

continue;

}

w++;

}

if(*w=='/0')

{

jilu=p;

}

else

{

jilu=w;

}

kill=*(w-1);

for(i=0,j=0;i<strlen(p);i++)

{

if(*(p+i)!=kill)

{

*(temp+j)=*(p+i);

j++;

}

}

*(temp+j)='/0';

p=temp;

}

}

printf("%s/n",p);

free(temp);

}

int main()

{

char *string="123";

int s=3,m=5;

findkill(string,s,m);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: