约瑟夫环

public class Ring {

	/**
	*使用数组实现约瑟夫环问题
	*由m个人围成一个首尾相连的圈报数。
	*从第一个人开始,从s开始报数,报到d的人出圈,
	*剩下的人继续从1开始报数,直到所有的人都出圈为止。
	*对于给定的s、d和n,求出所有人的出圈顺序.
	*/
	public static void main(String[] args) {
		//当前所有人
		String [] values = {"A","C","G","H","K","L","M","P","Q","B","O","W"};
		out(values);
		int n = values.length;		//当前人数
		int s = 3;					//开始报数的人
		int d = 4;					//报到第几个出圈
		int flag = -1;
		if(d<0){
			d = 1;
		}
		while(n>1){
			flag = ((s-1)+d)%n ;
			s = flag==0?n:flag;
			int sub = flag==0?n-1:flag - 1;	//每次出去的人由下标指定
			String [] newValues = new String[n-1];
			for(int j=0,i=0;j<n;j++){
				if(j==sub){
					//System.out.println("数据数量["+n+"]下标:values["+sub+"]出"+values[sub]);
					continue;
				}
				newValues[i++] = values[j];
			}
			values = newValues;
			out(values);
			n--;
		}
		System.out.println("最终结果为$ "+values[0]+" $留在圈内");
	}
	private static void out(String [] args){
		StringBuffer sbf = new StringBuffer();
		for(int j=0;j<args.length-1;j++){
			sbf.append(args[j]+",");
		}
		sbf.append(args[args.length-1]);
		System.out.println(sbf.toString());
	}
}


public class Ring_Two {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String [] values = {"A","C","G","H","K","L","M","P","Q","B","O","W"};
		System.out.println("初始人数:");
		out(values);
		int n = values.length;		//当前人数
		int s = 3;					//开始报数的人
		int d = 4;					//报到第几个出圈
		int sub = s-1;				//记录下标2
		int count = 0;				//记录出圈的人数
		while(count<n){
			for(int j=0;j<d;j++){
				//System.out.println(values[(sub+j)%n]);
				if("o".equals(values[(sub+j)%n])){
					sub++;
					j--;
				}
			}
			sub = (sub-1+d)%n;
			//System.out.println("sub["+sub+"]"+values[sub%n]+"出");
			System.out.print(values[sub%n]+"-->");
			values[sub]="o";
			while(sub<n){
				if("o".equals(values[sub%n])){
					sub++;
				}else{
					break;
				}
			}
			count++;
			//out(values);
		}
	}
	
	private static void out(String [] args){
		StringBuffer sbf = new StringBuffer();
		for(int j=0;j<args.length-1;j++){
			sbf.append(args[j]+",");
		}
		sbf.append(args[args.length-1]);
		System.out.println(sbf.toString());
	}
}

 

你可能感兴趣的:(C++,c,C#,J#)