1192 约瑟夫问题(1)
Time Limit : 2000/1000 MS(Java/Others) | Memory Limit :65536/32768 KB(Java/Others)
Submits : 1235 | Solved : 716
Description
模拟这个游戏。有n个人围成一圈,从第一个人开始沿顺时针方向报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那个人?
Input
输入一个整数n。(n<=1000)
Output
输出最后剩下的数。
Sample Input
5
Sample Output
4
HINT
Source
NBU OJ
解题思路:解题方法:用了模拟法,也就是通过数组来模拟这个报数的过程,设置两个数组其中一个用来存储开始准备报数的编号,后一个数组用来对报完数后的编号进行更新,例如:a{123} 报到3的时候把3去掉也就是a[3]=0(我这边是从一开始),然后剩下更新就由b数组来操作,其中_index为数组下标,下标之所以等于(flag+i)%ans 例如 12 当从1开始报数的时候报到3时候又回到下标1,以此类推,欧了。
代码:import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);//12345 1245 245 24 4
int n=sc.nextInt();
int a[]=new int[1000];
int b[]=new int[1000];
for(int i=1;i<=n;i++){
a[i]=i;
b[i]=i;
}
int ans=n;
int _index=0;
int flag=0;
while(ans>1){
for(int i=1;i<=3;i++){
_index=i+flag;
if(_index>ans)
_index=_index%ans;
if(i==3){
a[_index]=0;
ans--;
}
}
if(_index==a.length){
_index=1;
}
flag=_index;
int m=1;
for(int i=1;i<=n;i++){
if(a[i]!=0){
b[m++]=a[i];
}else{
flag-=1;
}
}
a=b;
}
System.out.println(a[1]);
}
}