1、约瑟夫环问题
package com.patrick.bishi;
import java.util.LinkedList;
import java.util.Scanner;
/**
* 约瑟夫环问题: 1,2,...n编号的人顺时针围坐一圈,每人一个密码数n,给定一个起始整数m,从第一个人开始从1报数,
* 到m时停止,该人出列,得到他的密码作为其实m,接着从下一个人开始从1重新报数,一次循环,直到所有人出列,按照出列顺序打印出出列人的编号 eg: 输入 6
* 3 6 5 4 3 2 1 ,空格分开的一组数字,第一个为n,第二个为m,以后的为n个人各自的密码 输出为 3 1 4 2 5 6
*
* @author patrick
* @date 10/9 2013
*
*/
public class Joseph {
public static void main(String[] args) {
LinkedList<Integer> jlist = new LinkedList<Integer>();
LinkedList<Integer> plist = new LinkedList<Integer>();
Scanner in = new Scanner(System.in);
String s = in.nextLine();
if (!s.matches("[\\d+ ]*")) {
System.err.println("input error !");
return;
}
String nums[] = s.split(" ");
int n = Integer.parseInt(nums[0]);// number of people
int m = Integer.parseInt(nums[1]);// original secret
if (nums.length < n + 2) {
System.err
.println("wrong input!,the number of people must match your input!");
return;
}
for (int i = 0; i < n; i++) {
jlist.add(Integer.parseInt(nums[i + 2]));
plist.add(i + 1);
}
int circleCount = 0;
StringBuilder sb = new StringBuilder();
System.out.print("secret =");
while (jlist.size() > 0) {
for (int i = 0; i < jlist.size(); i++) {
circleCount++;
if (circleCount == m) {
m = jlist.get(i);
System.out.print(m + "\t");
sb.append(plist.get(i)).append(" ");
jlist.remove(i);
plist.remove(i);
i--;
circleCount = 0;
}
}
}
System.out.println();
System.out.println("positon =" + sb.toString());
}
}
2、广义田忌赛马
package com.patrick.bishi;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
/**
* 广义田忌赛马:每匹马都有一个能力指数,齐威王先选马,田忌后选,马的能力相同,则齐威王胜。
* 输入:马匹数量 \n 齐威王的马匹能力值 \n 田忌的马匹能力值(能力值之间都是以空格分开)
* eg:输入:3 \n 1 2 3 \n 1 2 3 输出:2
* @author patrick
*
*/
public class TianJiSaima {
public static void main(String args[]) {
List<Integer> lTian = new ArrayList<Integer>();
List<Integer> lQi = new ArrayList<Integer>();
Scanner in = new Scanner(System.in);
System.out.println("参加赛马的马匹数量:");
int n = Integer.parseInt(in.nextLine().trim());
// 先得到齐威王的田忌的能力值
System.out.println("齐威王的马匹能力值:");
String qi = in.nextLine().trim();
// 然后得到田忌的田忌的能力值
System.out.println("田忌的马匹能力值:");
String tian = in.nextLine().trim();
if (!tian.matches("[\\d+ ]*") || !qi.matches("[\\d+ ]*")) {
System.err.println("input error !");
return;
}
String[] tAblity = tian.split(" ");
String[] qAblity = qi.split(" ");
if (tAblity.length != n || qAblity.length != n) {
System.err.println("the number of horses wrong !");
return;
}
for (int i = 0; i < n; i++) {
lTian.add(Integer.parseInt(tAblity[i]));
lQi.add(Integer.parseInt(qAblity[i]));
}
Collections.sort(lTian);
Collections.sort(lQi);
int i = 0, j = 0, x = n - 1, y = n - 1, cnt = 0;
boolean bLast = true;
while (bLast) {
// 是否是最后一匹马
if (x == i)
bLast = false;
if (lTian.get(x) > lQi.get(y)) {// 如果田忌当前最好的马可以胜齐王最好的马,那么比一场
x--;
y--;
cnt += 1;
} else if (lTian.get(i) > lQi.get(j)) {// 如果田忌当前最差的马可以胜齐王最差的马,那么比一场
i++;
j++;
cnt += 1;
} else {// 否则,让田忌最差的马和齐王最好的好比一场
i++;
y--;
}
}
System.out.println("田忌可以赢得赛马的场数为 " + cnt + " 场。");
lTian.clear();
lQi.clear();
}
}