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 4int 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]);}}