您的位置:首页 > 编程语言 > C语言/C++

POJ 1012(约瑟夫问题)

2014-07-22 08:43 218 查看
       我是直接模拟的,因为实在想不到什么好办法,不过看到0<k<14



     俗话说得好,不管黑猫白猫,抓到老鼠的就是好猫。

     于是在自家电脑模拟,打个表,就AC了。

     至于还有没有其他方法,有待研究,大家有什么好方法,请赐教,谢谢!

1、模拟:

   方法是,m从2开始判断,在1,2,3,······,2k中,每次找到第m个数,判断如果是大于k的,

   那么后面的数就向前移,否则m++,直至找到这样的m,使得找出的k个数都是大于k,

   这个m就是要找的最小的m。(也可以使用链表,不过本人还没学过链表,所以不在这介绍了,

   可参考百度百科:http://baike.baidu.com/view/213217.htm?fr=aladdin

#include<stdio.h>
int main()
{
int k,m,i,n,x,j;
int a[27];
bool bo;
scanf("%d",&k);
while(k)
{
for (i=1;i<=2*k;i++) a[i]=i;
m=1;
bo=false;
while(!bo)
{
m++;x=1;bo=true;
for (i=2*k;i>=k+1;i--)
{
n=m%i;
if (n==0) n=i;
n=(n+x-1)%i;
if (n==0) n=i;
if (a
<=k)
{
bo=false;
break;
}
for (j=n;j<i;j++) a[j]=a[j+1];
x=n;
}
}
printf("%d\n",m);
scanf("%d",&k);
}
return 0;
}
2、绝对0s算法:

#include<stdio.h>
int main()
{
int k,a[13]={2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
scanf("%d",&k);
while(k)
{
printf("%d\n",a[k-1]);
scanf("%d",&k);
}
return 0;
}

题目来自:http://poj.org/problem?id=1012
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ poj 游戏