跳水名将问题


问题描述:5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果.
         A选手说:B第二,我第三;
         B选手说:我第二,E第四;
         C选手说:我第一,D第二;
         D选手说:C最后,我第三;
         E选手说:我第四,A第一.

         决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错.请编程解出

         比赛的实际名次.


基本数据类型:

package com.plunge.data;

public class Statement {

	public String person;
	public int rank;
	public String source;
	public boolean isTruth = false;
	
	public Statement(String source)
	{
		this.source = source;
		person = source.split(" ")[0];
		rank = Integer.parseInt(source.split(" ")[1]);
	}
	
	public String toString() {
		return source;
	}
}

PlayerStatement 代表一个选手的陈述 ,   A选手说:B第二,我第三;

package com.plunge.data;


public class PlayerStatement {
	public String player;
	public Statement[] statements = new Statement[]{null, null};
	public int checkStatus = -1;
	public String[] rawData = new String[] {"",""};
	public SelectActions actions;
	
	public PlayerStatement(String playerName, String statementA, String statementB) {
		player = playerName;
		statements[0] = new Statement(statementA);
		statements[1] = new Statement(statementB);
		rawData[0] = statementA;
		rawData[1] = statementB;
	}
	
	public Statement getTruth() {
		if (checkStatus < 0) {
			System.out.println("checkStatus uninitialized!");
			return null;
		}
		if (checkStatus < 2) {
			return statements[checkStatus];
		}
		return null;
	}
	
	public Statement getUntruth() {
		if (checkStatus == 1) {
			return statements[0];
		} else if (checkStatus == 0) {
			return statements[1];
		}
		return null;
	}
	
	public String toString() {
		return player + " said: " + rawData[0] + "," + rawData[1];
	}
	
	public String getTruthString() {
		if (checkStatus >= 0 && checkStatus < 2) {
			return player + " told truth: " + rawData[checkStatus];
		} else {
			return player + " told no truth";
		}
	}

}

Main.java

package com.plunge;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import com.plunge.creator.Method1;
import com.plunge.creator.Method2;
import com.plunge.creator.MethodAcurate;
import com.plunge.creator.MethodSimple;
import com.plunge.data.PlayerStatement;

//A选手说:B第二,我第三;
//B选手说:我第二,E第四;
//C选手说:我第一,D第二;
//D选手说:C最后,我第三;
//E选手说:我第四,A第一.
//
//决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错.请编程解出
//比赛的实际名次.
public class Main {
//	statementLst.add(new PlayerStatement("A", "B 2", "A 3"));
//	statementLst.add(new PlayerStatement("B", "B 2", "E 4"));
//	statementLst.add(new PlayerStatement("C", "C 1", "D 2"));
//	statementLst.add(new PlayerStatement("D", "C 5", "D 3"));
//	statementLst.add(new PlayerStatement("E", "E 4", "A 1"));
	
//	statementLst.add(new PlayerStatement("A", "B 3", "A 4"));
//	statementLst.add(new PlayerStatement("B", "D 1", "C 4"));
//	statementLst.add(new PlayerStatement("C", "D 3", "C 4"));
//	statementLst.add(new PlayerStatement("D", "A 2", "D 3"));
	
//	statementLst.add(new PlayerStatement("A", "D 2", "B 4"));
//	statementLst.add(new PlayerStatement("B", "D 2", "A 1"));
//	statementLst.add(new PlayerStatement("C", "D 1", "C 3"));
//	statementLst.add(new PlayerStatement("D", "C 2", "D 4"));
	
	
	public static void main(String[] args) {
		//"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"
		//"A", "B", "C", "D", "E"
//		String[] playerArr = new String[] {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"};
//		ArrayList<PlayerStatement> ret = DivingIssueCreator.create(playerArr);
//		for (int i = 0; i < ret.size(); i++) {
//			PlayerStatement item = ret.get(i);
//			System.out.println(item.toString());
//		}
		
		PlungeRank plunge = new PlungeRank();
//		ArrayList<PlayerStatement> statementLst = new ArrayList<PlayerStatement>();
//		statementLst.add(new PlayerStatement("A", "D 3", "A 2"));
//		statementLst.add(new PlayerStatement("B", "B 4", "B 2"));
//		statementLst.add(new PlayerStatement("C", "A 1", "B 4"));
//		statementLst.add(new PlayerStatement("D", "C 4", "C 3"));
//		statementLst.add(new PlayerStatement("E", "A 4", "D 5"));
//		plunge.process(statementLst);
		
		Method1 oneWay = new Method1();
		Method2 twoWay = new Method2();
		MethodSimple simpleWay = new MethodSimple();
		MethodAcurate acurateWay = new MethodAcurate();
		ArrayList<Integer> correctIssues = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			String[] playerArr = new String[] {"A", "B", "C", "D", "E"};
			ArrayList<PlayerStatement> ret = acurateWay.create(playerArr);
			System.out.println("==========issue " + i + "=======================");
			for (int j = 0; j < ret.size(); j++) {
				System.out.println(ret.get(j).toString());
			}
			if (plunge.process(ret)) {
				correctIssues.add(i);
			}
		}
		System.out.println(correctIssues.toString() + ", " + correctIssues.size() + " issues generate success!");
	}
	
	
}

PlungeRank.java

核心代码,  采用DFS 搜索答案

package com.plunge;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.plunge.data.PlayerStatement;
import com.plunge.data.SelectActions;
import com.plunge.data.Statement;

public class PlungeRank {
	
	private ArrayList<PlayerStatement> statementLst = new ArrayList<PlayerStatement>();
	private ArrayList<String> allPlayers = new ArrayList<String>();
	private ArrayList<Integer> allRanks = new ArrayList<Integer>();
	
	private HashMap<String, Integer> checkFlags = new HashMap<String, Integer>();
	private HashMap<String, Integer> personMap = new HashMap<String, Integer>(); 
	private HashMap<Integer, String> rankMap = new HashMap<Integer, String>();
	private HashMap<String, ArrayList<Integer>> personMapFallacy = new HashMap<String, ArrayList<Integer>>();
	private HashMap<Integer, ArrayList<String>> rankMapFallacy = new HashMap<Integer, ArrayList<String>>();
	
	private static final int STATUS_UNCHECKED = 0; 
	private static final int STATUS_TRUE = 1;
	private static final int STATUS_FALSE = 2;
	
	public PlungeRank()
	{
	}
	
	public boolean process(ArrayList<PlayerStatement> lst) {
		ArrayList<ArrayList<Integer>> answerLst = new ArrayList<ArrayList<Integer>>();
		statementLst = lst;
		initData();
		int index = 0;
		PlayerStatement first = statementLst.get(0);
		while(true) {
//			System.out.println(index);
			PlayerStatement playerWords = statementLst.get(index);
			if(selectStatement(playerWords)) {
				index++;
				if (index < statementLst.size()) {
					PlayerStatement nextWords = statementLst.get(index);
					nextWords.checkStatus = -1;
				}
			} else {
				index--;
				if (index >= 0) {
					playerWords = statementLst.get(index);
					unSelectStatement(playerWords);
				}
			}
			if (index == statementLst.size()) {
				System.out.println("==========answer=======================");
				ArrayList<Integer> answer = retrieveAnswer();
				answerLst.add(answer);
				printAnswer(answer);
				
				index--;
				PlayerStatement lastOne = statementLst.get(index);
				unSelectStatement(lastOne);
			}
			
			if (first.checkStatus > 1) {
				//backtracking ended
				break;
			}
		}
		
		if (answerLst.size() < 1) {
			System.out.println("failed to find answer!");
		}
		
		if (answerLst.size() == 1) {
			return true;
		}
		return false;
	}
	
	private ArrayList<Integer> retrieveAnswer() {
		ArrayList<Integer> ret = new ArrayList<Integer>();
		for (int i = 0; i < statementLst.size(); i++) {
			PlayerStatement item = statementLst.get(i);
			ret.add(item.checkStatus);
		}
		return ret;
	}
	
	private void printAnswer(ArrayList<Integer> answer) {
		String[] allPlayerArr = new String[allPlayers.size()];
		allPlayers.toArray(allPlayerArr);
		ArrayList<String> playerLst = new ArrayList<String>(Arrays.asList(allPlayerArr));
		ArrayList<String> deduceLst = new ArrayList<String>();
		
		for (int i = 0; i < statementLst.size(); i++) {
			PlayerStatement item = statementLst.get(i);
			item.checkStatus = answer.get(i);
			System.out.println(item.getTruthString());
			playerLst.remove(item.getTruth().person);
		}
		
		HashMap<String, ArrayList<Integer>> deducedPersonFallacy = deducePersonFallacy();
		for (int i = 0; i < playerLst.size(); i++) {
			ArrayList<Integer> rankLst = deducedPersonFallacy.get(playerLst.get(i));
			if (rankLst.size() == 1) {
				deduceLst.add(playerLst.get(i) + " " + rankLst.get(0));
			}
		}
		
		System.out.println("==========deduce=======================");
		System.out.println(deduceLst.toString());
	}
	
	private HashMap<String, ArrayList<Integer>> deducePersonFallacy() {
		HashMap<String, ArrayList<Integer>> copy = new HashMap<String, ArrayList<Integer>>();
		Iterator<Entry<String, ArrayList<Integer>>> iter = personMapFallacy.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iter.next(); 
			String keyPerson = entry.getKey();
			ArrayList<Integer> rankLst = entry.getValue();
			
			Integer[] rankArr = new Integer[rankLst.size()];
			rankLst.toArray(rankArr);
			ArrayList<Integer> copiedRankLst =  new ArrayList<Integer>(Arrays.asList(rankArr));
			
			copy.put(keyPerson, copiedRankLst);
		}
//		System.out.println("deducePersonFallacy");
		int oldSingleNum = -1;
		while(true) {
			ArrayList<Integer> singleRanks = new ArrayList<Integer>();
			Iterator<Entry<String, ArrayList<Integer>>> iterCopy = copy.entrySet().iterator();
			while (iterCopy.hasNext()) {
				Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iterCopy.next(); 
				ArrayList<Integer> rankLst = entry.getValue();
				if (rankLst.size() == 1) {
					singleRanks.add(rankLst.get(0));
				}
			}
			if (oldSingleNum < 0) {
				oldSingleNum = singleRanks.size();
			} else if (oldSingleNum == singleRanks.size()){
				break;
			}
			if (!changeMap(copy, singleRanks)) {
				break;
			}
		}
		
		return copy;
	}
	
	private boolean changeMap(HashMap<String, ArrayList<Integer>> map, ArrayList<Integer> deduced) {
		Iterator<Entry<String, ArrayList<Integer>>> iter = map.entrySet().iterator();
		boolean changed = false;
		while (iter.hasNext()) {
			Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iter.next(); 
			ArrayList<Integer> rankLst = entry.getValue();
			if (rankLst.size() > 1) {
				for (int i = 0; i < deduced.size(); i++) {
					int value = deduced.get(i);
					int index = rankLst.indexOf(value);
					if (index >= 0) {
						rankLst.remove(index);
						changed = true;
					}
				}
			}
		}
		return changed;
	}
	
	private void initData() {
		allPlayers.clear();
		allRanks.clear();
		
		checkFlags = new HashMap<String, Integer>();
		personMap = new HashMap<String, Integer>();
		rankMap = new HashMap<Integer, String>();
		personMapFallacy = new HashMap<String, ArrayList<Integer>>();
		rankMapFallacy = new HashMap<Integer, ArrayList<String>>();
		
		for (int i = 0; i < statementLst.size(); i++) {
			int rank = i + 1;
			String playerString = statementLst.get(i).player;
			allRanks.add(rank);
			allPlayers.add(playerString);
		}
		
		for (int i = 0; i < statementLst.size(); i++) {
			PlayerStatement player = statementLst.get(i);
			Statement words1 = player.statements[0];
			Statement words2 = player.statements[1];
			checkFlags.put(words1.source, STATUS_UNCHECKED);
			checkFlags.put(words2.source, STATUS_UNCHECKED);
			personMap.put(player.player, -1);
			int rank = i + 1;
			rankMap.put(rank, "");
			
			Integer[] allRankArr = new Integer[allRanks.size()];
			allRanks.toArray(allRankArr);
			personMapFallacy.put(player.player, new ArrayList<Integer>(Arrays.asList(allRankArr)));
			
			String[] allPlayerArr = new String[allPlayers.size()];
			allPlayers.toArray(allPlayerArr);
			rankMapFallacy.put(rank, new ArrayList<String>(Arrays.asList(allPlayerArr)));
		}
	}
	
	private boolean selectStatement(PlayerStatement statement) {
		statement.checkStatus++;
		if (statement.checkStatus > 1) {
			return false;
		}
//		System.out.println(statement.getTruthString());
//		if (statement.player.equals("C")) {
//			System.out.println("ssaa");
//		}
		Statement truth = statement.getTruth();
		SelectActions actions = getSelectActions(statement);
//		boolean permission1 = canAddStatementToMap(truth, true);
//		boolean permission2 = canAddStatementToMap(fallacy, false);
		if (actions != null) {
			//modify 5 maps and record changes for backtracking
			for (int i = 0; i < actions.checkFlagChanges.size(); i++) {
				String checkMapKey = actions.checkFlagChanges.get(i);
				if (truth.source.equals(checkMapKey)) {
					checkFlags.put(checkMapKey, STATUS_TRUE);
				} else {
					checkFlags.put(checkMapKey, STATUS_FALSE);
				}
			}
			int rankMapKey = actions.rankMapChange;
			if (rankMapKey > 0) {
				rankMap.put(rankMapKey, truth.person);
			}
			String personMapKey = actions.personMapChange;
			if (personMapKey.length() > 0) {
				personMap.put(personMapKey, truth.rank);
			}
			
			Iterator<Entry<Integer, ArrayList<String>>> iter = actions.rankFallacyChanges.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry<Integer, ArrayList<String>> entry = (Map.Entry<Integer, ArrayList<String>>) iter.next();
				int keyRank = entry.getKey();
				ArrayList<String> deleted = entry.getValue();
				ArrayList<String> oldLst = rankMapFallacy.get(keyRank);
				for (int i=0; i<deleted.size(); i++) {
					String item = deleted.get(i);
					oldLst.remove(item);
				}
			}
			
			Iterator<Entry<String, ArrayList<Integer>>> iterPerson = actions.personFallacyChanges.entrySet().iterator();
			while (iterPerson.hasNext()) {
				Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iterPerson.next(); 
				String keyPerson = entry.getKey();
				ArrayList<Integer> deleted = entry.getValue();
				ArrayList<Integer> oldLst = personMapFallacy.get(keyPerson);
				for (int i=0; i<deleted.size(); i++) {
					Integer item = deleted.get(i);
					oldLst.remove(item);
				}
			}
			statement.actions = actions;
			
			return true;
		} else {
			return selectStatement(statement);
		}
	}
	
	private void unSelectStatement(PlayerStatement statement) {
	//	trace(statement.player, " unselect ");
		SelectActions actions = statement.actions;
		if (actions != null) {
			for (int i = 0; i < actions.checkFlagChanges.size(); i++) {
				String checkMapKey = actions.checkFlagChanges.get(i);
				checkFlags.put(checkMapKey, STATUS_UNCHECKED);
			}
			int rankMapKey = actions.rankMapChange;
			if (rankMapKey > 0) {
				rankMap.put(rankMapKey, "");
			}
			String personMapKey = actions.personMapChange;
			if (personMapKey.length() > 0) {
				personMap.put(personMapKey, -1);
			}
			
			Iterator<Entry<Integer, ArrayList<String>>> iter = actions.rankFallacyChanges.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry<Integer, ArrayList<String>> entry = (Map.Entry<Integer, ArrayList<String>>) iter.next();
				int keyRank = entry.getKey();
				ArrayList<String> deleted = entry.getValue();
				ArrayList<String> oldLst = rankMapFallacy.get(keyRank);
				for (int i=0; i<deleted.size(); i++) {
					String item = deleted.get(i);
					if (oldLst.indexOf(item) < 0) {
						oldLst.add(item);
					}
				}
			}
			
			Iterator<Entry<String, ArrayList<Integer>>> iterPerson = actions.personFallacyChanges.entrySet().iterator();
			while (iterPerson.hasNext()) {
				Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iterPerson.next(); 
				String keyPerson = entry.getKey();
				ArrayList<Integer> deleted = entry.getValue();
				ArrayList<Integer> oldLst = personMapFallacy.get(keyPerson);
				for (int i=0; i<deleted.size(); i++) {
					Integer item = deleted.get(i);
					if (oldLst.indexOf(item) < 0) {
						oldLst.add(item);
					}
				}
			}
		}
		statement.actions = null;
	}
	
	private SelectActions getSelectActions(PlayerStatement words) {
		Statement truth = words.getTruth();
		Statement fallacy = words.getUntruth();
		SelectActions actions = new SelectActions(allPlayers);
		
		if (checkFlags.get(truth.source) == STATUS_UNCHECKED) {
			actions.checkFlagChanges.add(truth.source);
		} else {
			if (checkFlags.get(truth.source) != STATUS_TRUE) {
				return null;
			}
		}
		if (checkFlags.get(fallacy.source) == STATUS_UNCHECKED) {
			actions.checkFlagChanges.add(fallacy.source);
		} else {
			if (checkFlags.get(fallacy.source) != STATUS_FALSE) {
				return null;
			}
		}
		
		if (personMap.get(truth.person) == -1) {
//			personMap.put(truth.person, truth.rank);
			actions.personMapChange = truth.person;
			
			Iterator<Entry<String, ArrayList<Integer>>> iter = personMapFallacy.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iter.next(); 
				String keyPerson = entry.getKey();
				if (!keyPerson.equals(truth.person)) {
					ArrayList<Integer> ranks = entry.getValue();
					int removeIndex = ranks.indexOf(truth.rank);
					if (removeIndex >= 0) {
//						int removed = ranks.remove(removeIndex);
						ArrayList<Integer> lst = actions.personFallacyChanges.get(keyPerson);
						lst.add(truth.rank);
					}
				}
			}
		} else if (personMap.get(truth.person) != truth.rank) {
			return null;
		}
		
		if (rankMap.get(truth.rank) == "") {
//			rankMap.put(truth.rank, truth.person);
			actions.rankMapChange = truth.rank;
			
			Iterator<Entry<Integer, ArrayList<String>>> iter = rankMapFallacy.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry<Integer, ArrayList<String>> entry = (Map.Entry<Integer, ArrayList<String>>) iter.next();
				int keyRank = entry.getKey();
				if (keyRank != truth.rank) {
					ArrayList<String> persons = entry.getValue();
					int removeIndex = persons.indexOf(truth.person);
					if (removeIndex >= 0) {
//						String removed = persons.remove(removeIndex);
						ArrayList<String> lst = actions.rankFallacyChanges.get(keyRank);
						lst.add(truth.person);
					}
				}
			}
		} else if (!rankMap.get(truth.rank).equals(truth.person)) {
			return null;
		}
		
		ArrayList<Integer> rankLst = personMapFallacy.get(fallacy.person);
		int index = rankLst.indexOf(fallacy.rank);
		if (index >= 0) {
//			rankLst.remove(index);
			ArrayList<Integer> lst = actions.personFallacyChanges.get(fallacy.person);
			if (lst.indexOf(fallacy.rank) < 0) {
				lst.add(fallacy.rank);
			}
		}
		
		ArrayList<String> personLst = rankMapFallacy.get(fallacy.rank);
		index = personLst.indexOf(fallacy.person);
		if (index >= 0) {
//			personLst.remove(index);
			ArrayList<String> lst = actions.rankFallacyChanges.get(fallacy.rank);
			if (lst.indexOf(fallacy.person) < 0) {
				lst.add(fallacy.person);
			}
		}
		
		Iterator<Entry<String, ArrayList<Integer>>> iter = actions.personFallacyChanges.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>) iter.next(); 
			String keyPerson = entry.getKey();
			ArrayList<Integer> ranks = entry.getValue();
			ArrayList<Integer> currentRankLst = personMapFallacy.get(keyPerson);
			if (ranks.size() == currentRankLst.size()) {
				return null;
			}
		}
		
		Iterator<Entry<Integer, ArrayList<String>>> iterChanges = actions.rankFallacyChanges.entrySet().iterator();
		while (iterChanges.hasNext()) {
			Entry<Integer, ArrayList<String>> entry = (Map.Entry<Integer, ArrayList<String>>) iterChanges.next(); 
			Integer keyRank = entry.getKey();
			ArrayList<String> persons = entry.getValue();
			ArrayList<String> currentPersonLst = rankMapFallacy.get(keyRank);
			if (persons.size() == currentPersonLst.size()) {
				return null;
			}
		}
		
		return actions;
	}
	
}

SelectActions类,用于保存对PlungeRank类中的五个hash map 所做的改动, 目的是用于在回溯节点时,还原对这五个 hash map的改动

package com.plunge.data;

import java.util.ArrayList;
import java.util.HashMap;

public class SelectActions {
	
	public SelectActions(ArrayList<String> allPlayers) {
		//init rankFallacyChanges and personFallacyChanges
		for (int i = 0; i < allPlayers.size(); i++) {
			String player = allPlayers.get(i);
			personFallacyChanges.put(player, new ArrayList<Integer>());
			Integer rank = i+1;
			rankFallacyChanges.put(rank, new ArrayList<String>());
		}
	}

	public ArrayList<String> checkFlagChanges = new ArrayList<String>();
	public int rankMapChange = -1;
	public String personMapChange = "";
	
	public HashMap<Integer, ArrayList<String>> rankFallacyChanges = new HashMap<Integer, ArrayList<String>>();
	
	public HashMap<String, ArrayList<Integer>> personFallacyChanges = new HashMap<String, ArrayList<Integer>>();
}


以上部分是求解跳水名将问题的代码,接下来是生成跳水名将问题的代码

package com.plunge.Interface;

import java.util.ArrayList;

import com.plunge.data.PlayerStatement;

public interface ICreator {
	public ArrayList<PlayerStatement> create(String[] players);
}

package com.plunge.creator;

import java.util.ArrayList;

import com.plunge.Interface.ICreator;
import com.plunge.data.PlayerStatement;
import com.plunge.util.Tool;

public class Method1 implements ICreator{

	@Override
	public ArrayList<PlayerStatement> create(String[] players) {
		int size = players.length;
		ArrayList<String> allCombinations = getAll2Combs(players);
		ArrayList<Integer> personLst = new ArrayList<Integer>();
		ArrayList<Integer> rankLst = new ArrayList<Integer>();
		for (int i = 1; i <= size; i++) {
			rankLst.add(i);
			personLst.add(i-1);
		}
		personLst = Tool.shuffle(personLst);
		rankLst = Tool.shuffle(rankLst);
		
		ArrayList<PlayerStatement> statements = new ArrayList<PlayerStatement>();
		for (int i=0; i < size; i++) {
			ArrayList<Integer> randomSet = new ArrayList<Integer>();
			String combo = getRandomCombination(allCombinations);
			String person1 = combo.split(" ")[0];
			String person2 = combo.split(" ")[1];
			get2RandomItems(rankLst, randomSet);
			int rank1 = randomSet.get(0);
			int rank2 = randomSet.get(1);
			String statementA = person1 + " " + rank1;
			String statementB = person2 + " " + rank2;
			PlayerStatement playerWords = new PlayerStatement(players[i], statementA, statementB);
			statements.add(playerWords);
		}
		return statements;
	}
	
	private void get2RandomItems(ArrayList<Integer> list, ArrayList<Integer> ret) {
		int first = (int) (list.size() * Math.random());
		int second = (int) (list.size() * Math.random());
		while (first == second) {
			second = (int) (list.size() * Math.random());
		}
		ret.clear();
		ret.add(list.get(first));
		ret.add(list.get(second));
	}
	
	private ArrayList<String> getAll2Combs(String[] players) {
		ArrayList<String> ret = new ArrayList<String>();
		for (int i = 0; i < players.length; i++) {
			for (int j = i+1; j < players.length; j++) {
				String item = players[i] + " " + players[j];
				ret.add(item);
			}
		}
		return ret;
	}
	
	private String getRandomCombination(ArrayList<String> combos) {
		int index = (int) (Math.random() * combos.size());
		String item = combos.get(index);
		combos.remove(index);
		return item;
	}

}


当选手很多时, MethodAcurate类, 生成问题的成功率很高,Method1类成功率很低,
比如:
当有12个选手:"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", Method1的成功率不到 1%, 而MethodAcurate的成功率大于 80%, 
当有5个选手: "A", "B", "C", "D", "E",Method1的成功率 大于20 %, MethodAcurate的成功率大于 50%
Method1可能生成需要推理才能得到最终结果的问题, MethodAcurate目前生成的都是不需要推理,就能得到结果的问题


package com.plunge.creator;

import java.util.ArrayList;

import com.plunge.Interface.ICreator;
import com.plunge.data.PlayerStatement;
import com.plunge.data.Statement;
import com.plunge.util.Tool;

public class MethodAcurate implements ICreator {
	
	private String[] playerArr;
	ArrayList<Integer> personLst = new ArrayList<Integer>();
	ArrayList<Integer> rankLst = new ArrayList<Integer>();
	
	public ArrayList<PlayerStatement> create(String[] players) {
		personLst.clear();
		rankLst.clear();
		playerArr = players;
		int size = players.length;
		for (int i = 1; i <= size; i++) {
			rankLst.add(i);
			personLst.add(i-1);
		}
		personLst = Tool.shuffle(personLst);
		rankLst = Tool.shuffle(rankLst);
		
		ArrayList<Statement> answer = new ArrayList<Statement>();
		for (int i = 0; i < size; i++) {
			answer.add(new Statement(players[personLst.get(i)] + " " + rankLst.get(i)));
		}
		System.out.println("================generator======================");
//		System.out.println("personLst: " + personLst.toString());
//		System.out.println("rankLst: " + rankLst.toString());
		System.out.println("supposed: " + answer.toString());
		
		ArrayList<PlayerStatement> statements = new ArrayList<PlayerStatement>();
		for (int i = 0; i < size; i++) {
			Statement fallacy = getFalseStatement(answer, i);
			Statement truth = answer.get(i);
			String sen1 = truth.source;
			String sen2 = fallacy.source;
			PlayerStatement words;
			if ( (int) (Math.random() * 2) == 1) {
				words = new PlayerStatement(playerArr[i], sen1, sen2);
			} else {
				words = new PlayerStatement(playerArr[i], sen2, sen1);
			}
			statements.add(words);
		}
		
		return statements;
	}
	
	private Statement getFalseStatement(ArrayList<Statement> answer, int index) {
		Statement item = answer.get(index);
		int personInt = getRandomItem(personLst);
		String person = playerArr[personInt];
		while (person.equals(item.person)) {
			personInt = getRandomItem(personLst);
			person = playerArr[personInt];
		}
		int rightRank = getRankByPerson(answer, person);
		int rank = getRandomItem(rankLst);
//		System.out.println("getFalseStatement, rank:"+rank+", mentioned:"+item.rank+","+rightRank);
		while (rank == item.rank || rank == rightRank) {
			rank = getRandomItem(rankLst);
//			System.out.println("getFalseStatement, rank:"+rank);
		}
		return new Statement(person + " " + rank);
	}
	
	private int getRandomItem(ArrayList<Integer> lst) {
		int index = (int) (lst.size() * Math.random());
		return lst.get(index);
	}
	
	private int getRankByPerson(ArrayList<Statement> answer, String person) {
		for (int i = 0; i < answer.size(); i++) {
			if (answer.get(i).person.equals(person)) {
				return answer.get(i).rank;
			}
		}
		return 1;
	}
	
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值