62,635
社区成员




import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
public static class Answer {
public int number;
public String name;
public Answer(int number, String name) {
this.number = number;
this.name = name;
}
@Override
public String toString() {
return number + name;
}
}
public static void main(String[] args) {
Answer[][] allAnswers = {
{new Answer(2, "陕西"), new Answer(5, "甘肃")},
{new Answer(2, "湖北"), new Answer(4, "山东")},
{new Answer(1, "山东"), new Answer(5, "吉林")},
{new Answer(3, "湖北"), new Answer(4, "吉林")},
{new Answer(2, "甘肃"), new Answer(3, "陕西")}
};
Answer[][] answerSheet = getAnswerSheet(allAnswers);
List<Answer[]> rightAnswer = findRightAnswers(answerSheet);
rightAnswer.forEach(answers -> System.out.println(Arrays.toString(answers)));
}
public static Answer[][] getAnswerSheet(Answer[][] allAnswers) {
// 计算答案表的大小为:2的allAnswers.size次幂
int sheetSize = (int) Math.pow(2, allAnswers.length);
// 创建答案表
Answer[][] answerSheet = new Answer[sheetSize][allAnswers.length];
// 遍历所有答案,并填充到答案表中
for (int outIndex = 0; outIndex < allAnswers.length; outIndex++) {
// 计算答案可以连续填充的最大次数
int maxPutCount = (int) Math.pow(2, allAnswers.length - 1 - outIndex);
Answer[] answers = allAnswers[outIndex];
for (int index = 0; index < answers.length; index++) {
Answer answer = answers[index];
int putCount = 0;
for (int i = 0; i < answerSheet.length; i++) {
if (++putCount <= maxPutCount) {
answerSheet[i + index * maxPutCount][outIndex] = answer;
} else if (putCount % maxPutCount == 0) {
putCount = 0;
}
}
}
}
return answerSheet;
}
/** 找到答案表中的所有正确答案 */
public static List<Answer[]> findRightAnswers(Answer[][] answerSheet) {
List<Answer[]> rightAnswer = new ArrayList<>();
// 遍历每一组答案,并验证是否正确
for (Answer[] oneGroupAnswer : answerSheet) {
if (isRightAnswer(oneGroupAnswer)) {
rightAnswer.add(oneGroupAnswer);
}
}
return rightAnswer;
}
/** 判断一组答案是否正确 */
public static boolean isRightAnswer(Answer[] oneGroupAnswer) {
List<Answer> rightAnswers = new ArrayList<>();
for (Answer a : oneGroupAnswer) {
if (rightAnswers.stream().anyMatch(rightAnswer ->
a.number == rightAnswer.number
|| a.name.equals(rightAnswer.name))) {
return false;
}
rightAnswers.add(a);
}
return true;
}
}
运行结果如下:
[5甘肃, 2湖北, 1山东, 4吉林, 3陕西]
// 定义一个Answer类来表示一个答案
data class Answer(val number: Int, val name: String) {
override fun toString() = "$number$name"
}
fun main() {
val allAnswers = arrayOf(
arrayOf(Answer(1, "一"), Answer(3, "五")),
arrayOf(Answer(2, "二"), Answer(1, "五")),
arrayOf(Answer(3, "三"), Answer(3, "五")),
arrayOf(Answer(4, "四"), Answer(4, "五")),
arrayOf(Answer(5, "五"), Answer(5, "四"))
)
val answerSheet = getAnswerSheet(allAnswers)
val rightAnswer = findRightAnswers(answerSheet)
rightAnswer.forEach { println(it.contentToString()) }
}
private fun getAnswerSheet(allAnswers: Array<Array<Answer>>): Array<Array<Answer>> {
// 计算答案表的大小为:2的allAnswers.size次幂
val sheetSize = 2.0.pow(allAnswers.size).toInt()
// 创建答案表
val answerSheet = Array(sheetSize) { Array(allAnswers.size) { Answer(0, "") } }
// 遍历所有答案,并填充到答案表中
allAnswers.forEachIndexed { outIndex, answers ->
// 计算答案可以连续填充的最大次数
val maxPutCount = 2.0.pow((allAnswers.size - 1 - outIndex).toDouble()).toInt()
answers.forEachIndexed { index, answer ->
var putCount = 0
for (i in answerSheet.indices) {
if (++putCount <= maxPutCount) {
answerSheet[i + index * maxPutCount][outIndex] = answer
} else if (putCount % maxPutCount == 0) {
putCount = 0
}
}
}
}
return answerSheet
}
/** 找到答案表中的所有正确答案 */
fun findRightAnswers(answerSheet: Array<Array<Answer>>): List<Array<Answer>> {
val rightAnswer = mutableListOf<Array<Answer>>()
// 遍历每一组答案,并验证是否正确
answerSheet.forEach { oneGroupAnswer ->
if (isRightAnswer(oneGroupAnswer)) {
rightAnswer.add(oneGroupAnswer)
}
}
return rightAnswer
}
/** 判断一组答案是否正确 */
fun isRightAnswer(oneGroupAnswer: Array<Answer>): Boolean {
val rightAnswers = mutableListOf<Answer>()
oneGroupAnswer.forEach { answer ->
if (rightAnswers.any { it.number == answer.number || it.name == answer.name }) {
return false
}
rightAnswers.add(answer)
}
return true
}
运行结果如下:
[1一, 2二, 3三, 4四, 5五]
[1一, 2二, 3三, 4五, 5四]
通过这个暴力破解,还发现了这里出的题是有问题的,正确答案有两个。所以,如果你出题有多个正确答案,通过暴力破解轻松可以计算出来,如果用别的方式就困难多了。
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, String> map =new HashMap<>();
List<List<Demo>> list = new ArrayList<List<Demo>>();
List<Demo> demo = new ArrayList<Demo>();
demo.add(new Demo(2, "陕西"));
demo.add(new Demo(5, "甘肃"));
list.add(demo);
demo = new ArrayList<Demo>();
demo.add(new Demo(2, "湖北"));
demo.add(new Demo(4, "山东"));
list.add(demo);
demo = new ArrayList<Demo>();
demo.add(new Demo(1, "山东"));
demo.add(new Demo(5, "吉林"));
list.add(demo);
demo = new ArrayList<Demo>();
demo.add(new Demo(3, "湖北"));
demo.add(new Demo(4, "吉林"));
list.add(demo);
demo = new ArrayList<Demo>();
demo.add(new Demo(2, "甘肃"));
demo.add(new Demo(3, "陕西"));
list.add(demo);
demo = new ArrayList<Demo>();
boolean flag = true ;
int t = 0;
while(t < 2&&flag ) {
map.put(list.get(0).get(t).getKey(), list.get(0).get(t).getValue());
for (int i = 1 ; i < 5 ; i ++) {
demo = list.get(i);
if (!map.containsKey(demo.get(0).getKey()) && !map.containsValue(demo.get(0).getValue())) {
map.put(demo.get(0).getKey(),demo.get(0).getValue());
}else if(!map.containsKey(demo.get(1).getKey())&&!map.containsValue(demo.get(1).getValue())){
map.put(demo.get(1).getKey(), demo.get(1).getValue());
}else {
map.clear();
break;
}
if (i == 4 &&flag == true) flag=false;
}
t++;
}
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()) {
Entry<Integer, String> entry = iterator.next();
System.out.println(entry.getKey()+"号是" +entry.getValue());
}
}
}
class Demo {
private Integer key;
private String value;
/**
* @param key
* @param value
*/
public Demo(int key, String value) {
this.key = key;
this.value = value;
}
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "Demo [key=" + key + ", value=" + value + "]";
}
}
package chapter4;
import java.util.*;
/**
* A、B、C、D、E 五位同学
* 1、2、3、4、5 五个省份
* <p>
* A: 2 -> 陕西 5 -> 甘肃
* B: 2 -> 湖北 4 -> 山东
* C: 1 -> 山东 5 -> 吉林
* D: 3 -> 湖北 4 -> 吉林
* E: 2 -> 甘肃 3 -> 陕西
* <p>
* 每位同学答对一个省份,并且每个编号只有一位同学答对,问1-5号省份对应的名称
*/
public class Reasoning {
/**
* 同学
*/
private static List<String> students = new ArrayList<>(5);
/**
* 城市
*/
private static Map<Integer, String> citys = new HashMap<>(5);
/**
* 证词
*/
private static Map<String, Map<Integer, String>> testimony = new HashMap<>();
public static void main(String[] args) {
Reasoning reasoning = new Reasoning();
reasoning.prove();
System.out.println("最终得出:" + citys);
}
public Reasoning() {
students = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E"));
Map<Integer, String> A = new LinkedHashMap<>();
A.put(2, "陕西");
A.put(5, "甘肃");
testimony.put("A", A);
Map<Integer, String> B = new LinkedHashMap<>();
B.put(4, "山东");
B.put(2, "湖北");
testimony.put("B", B);
Map<Integer, String> C = new LinkedHashMap<>();
C.put(5, "吉林");
C.put(1, "山东");
testimony.put("C", C);
Map<Integer, String> D = new LinkedHashMap<>();
D.put(4, "吉林");
D.put(3, "湖北");
testimony.put("D", D);
Map<Integer, String> E = new LinkedHashMap<>();
E.put(2, "甘肃");
E.put(3, "陕西");
testimony.put("E", E);
}
/**
* 开始证明
* <p>
* 1.假设 A 答对 第一句
*/
private void prove() {
boolean check = true;
for (String student : students) {
Map<Integer, String> city = testimony.get(student);
boolean flag = false;
for (Integer cityCode : city.keySet()) {
String tempCityName = city.get(cityCode);
if (checkCity(student, cityCode, tempCityName)) {
flag = true;
break;
}
}
if (!flag) {
check = false;
System.out.println("学生" + student + "证词" + city + "没有得到验证。");
break;
}
}
// 冲突,前面假设出错
if (!check) {
citys.clear();
System.out.println("前期猜想出错,重新开始!");
revisionStu();
prove();
}
}
/**
* 验证猜想
*
* @param student 学生
* @param cityCode 城市代码
* @param tempCityName 城市名称
* @return 是否符合验证
*/
private boolean checkCity(String student, Integer cityCode, String tempCityName) {
String cityName = citys.get(cityCode);
if ((cityName == null || cityName.equals(tempCityName)) && !citys.containsValue(tempCityName)) {
citys.put(cityCode, tempCityName);
System.out.println("学生" + student + "证词:" + cityCode + "是" + tempCityName);
return true;
}
return false;
}
/**
* 调整学生顺序
*/
private void revisionStu() {
String stu = students.get(0);
students.remove(stu);
students.add(stu);
}
}
// 定义一个Answer类来表示一个答案
data class Answer(val number: Int, val name: String)
// 定义一个Student类来表示一个同学
data class Student(val first: Answer, val second: Answer)
fun main() {
// 定义A、B、C、D、E五个同学
val A = Student(Answer(2, "陕西"), Answer(5, "甘肃"))
val B = Student(Answer(2, "湖北"), Answer(4, "山东"))
val C = Student(Answer(1, "山东"), Answer(5, "吉林"))
val D = Student(Answer(3, "湖北"), Answer(4, "吉林"))
val E = Student(Answer(2, "甘肃"), Answer(3, "陕西"))
// 定义一个集合,保存未知正确答案的所有同学
var unknownAnswerStudentList = mutableListOf(A, B, C, D, E)
// 定义保存正确答案的集合
val rightAnswerList = mutableListOf<Answer>()
// 假设第一个人的第一个答案是正确答案,保存到正确答案集合中
rightAnswerList.add(A.first)
// 因为找到A同学的正确答案了,所以把A同学从集合中移除
unknownAnswerStudentList.remove(A)
// 找到所有正确答案
findAllRightAnswers(unknownAnswerStudentList, rightAnswerList, unknownAnswerStudentList.size)
if (rightAnswerList.size == 5) {
println("第一次假设就找到了正确答案,如下:")
} else {
println("第一次假设找不到正确答案,第二次肯定是正确答案,如下:")
// 没找齐5个答案,说明最初假设的答案是错的,则另一个必定是正确答案,重新找
unknownAnswerStudentList = mutableListOf(A, B, C, D, E)
rightAnswerList.clear()
rightAnswerList.add(A.second) // 假设另一个为正确答案
unknownAnswerStudentList.remove(A)
findAllRightAnswers(unknownAnswerStudentList, rightAnswerList, unknownAnswerStudentList.size)
}
// 打印正确答案
rightAnswerList.forEach(System.out::println)
}
fun findAllRightAnswers(unknownAnswerStudentList: MutableList<Student>, rightAnswerList: MutableList<Answer>, findCount: Int) {
// 遍历每一个同学,使用iterator是因为在遍历集合的同时还要删除集合的元素。
val iterator = unknownAnswerStudentList.iterator()
while (iterator.hasNext()) {
val student = iterator.next()
// 通过正确答案找正确答案
if (rightAnswerList.any { student.first.number == it.number || student.first.name == it.name }) {
// 如果第一个答案的编号或名称与正确答案的相同,根据"每个编号只有一个人答对"说明这个是错误答案,则第二个答案可能是正确答案
if (rightAnswerList.any { student.second.number == it.number || student.second.name == it.name }) {
// 如果第二个答案的编号或名称与正确答案相同,说明这个也是错误答案,说明我们的假设是错误的,无解,退出循环
break
}
rightAnswerList.add(student.second) // 找到了正确答案
iterator.remove() // 此学生已找到正确答案,可以从集合中移除掉了
} else if (rightAnswerList.any { student.second.number == it.number || student.second.name == it.name }) {
// 如果第二个答案的编号与正确答案的相同,根据"每个编号只有一个人答对"说明这个是错误答案,则第一个答案可能是正确答案
if (rightAnswerList.any { student.first.number == it.number || student.first.name == it.name }) {
// 如果第一个答案的编号或名称与正确答案相同,说明这个也是错误答案,说明我们的假设是错误的,无解,退出循环
break
}
rightAnswerList.add(student.first) // 找到了正确答案
iterator.remove() // 此学生已找到正确答案,可以从集合中移除掉了
}
}
if (unknownAnswerStudentList.size > 0 && findCount - 1 > 0) {
// 如果还有同学没找到正确答案,且没有超过查找次数,则递归循环去找
// 设定查找次数是因为如果你假设的答案是错误的,则永远也找不齐5个正确答案造成死循环
findAllRightAnswers(unknownAnswerStudentList, rightAnswerList, findCount - 1)
}
}
运行结果如下:
第一次假设找不到正确答案,第二次肯定是正确答案,如下:
Answer(number=5, name=甘肃)
Answer(number=1, name=山东)
Answer(number=3, name=陕西)
Answer(number=2, name=湖北)
Answer(number=4, name=吉林)
觉得难的同学都是Java基础不扎实造成的,大家可以关注我的博客,多多交流:https://blog.csdn.net/android_cai_niao
我也是第一次看到这道题,刚看到题时确实觉得有点难,但是当把题目审清楚理解清楚之后就很简单了,写代码的时候再使用面向对象的方式去写就非常的简单,比如一个学生用Student表示,而答案是一个学生的属性;一个答案用Answer表示,编号和省份是Answer的属性,大家一定要经常面向对象去写代码,不然你可能虽然有思路了,但是总感觉代码一写就觉得怎么没那么简单了!那是因为你的代码是面向过程的,不是面向对象的。
这里给大家讲一下我对题目的理解:每个同学都有两个答案,且肯定有一个是对的,有一个是错的,而且这个同学的正确答案肯定在另一个同学里有错误答案,这样才能推出这个同学的正确答案,比如:
A同学 2-陕西,5-甘肃
E同学 2-甘肃,3-陕西
我们就只看这两个同学,假设A同学的2-陕西是正确答案,根据"每个编号只有一个同学答对"的规则,可知2-甘肃是错的,因为2号只会对应到一个正确的省份陕西,反过来,陕西对应到了2号,则3-陕西也是错误答案了,什么?E同学的两个答案都是错误的?没错,就是这样的,存在这种情况是因为我们随便假设了一个答案为真,出现一个同学两答案都不正确的话,说明我们的假设出错了,出现了无解,此时再假设另一个答案为正确答案肯定就是对的了,因此,细节就是,通过一个正确答案的编号或省份名称都可以找到错误的答案,然后通过错误答案另一个自然就是正确答案了。
说了这么多,简单总结一下思路就是:随便假设一个是正确答案,我们可以通过一个正确答案找到错误答案,通过此错误答案又得到另一个正确答案,再通过这个正确答案再找错误答案,一直循环找就行了 ,总体思路是很简单的,就是细节上代码逻辑容易写错,慢慢调试就好了,关键总体思路不能乱!
最后再提醒一点,写代码一定要面向对象去写,很重要哦!
public class GuessProvinces {
private static Map<Integer, String> answerMap =
new HashMap<>();
private static Map<String,List<String>> guessesMap = new HashMap<>();
private static Map<Integer, String> SA = new HashMap<>();
private static Map<Integer, String> SB = new HashMap<>();
private static Map<Integer, String> SC = new HashMap<>();
private static Map<Integer, String> SD = new HashMap<>();
private static Map<Integer, String> SE = new HashMap<>();
static {
SA.put(2, "SHANXI");
SA.put(5, "GANSU");
SB.put(2, "HUBEI");
SB.put(4, "SHANDONG");
SC.put(1, "SHANDONG");
SC.put(5, "JILIN");
SD.put(3, "HUBEI");
SD.put(4, "JILIN");
SE.put(2, "GANSU");
SE.put(3, "SHANXI");
}
public static void main(String[] args) {
String StudentA_1 = "01000"; //0
String StudentA_2 = "00001"; //1
List<String> StudentA = new ArrayList<>();
StudentA.add(StudentA_1);
StudentA.add(StudentA_2);
String StudentB_1 = "01000"; //2
String StudentB_2 = "00010"; //3
List<String> StudentB = new ArrayList<>();
StudentB.add(StudentB_1);
StudentB.add(StudentB_2);
String StudentC_1 = "10000"; //4
String StudentC_2 = "00001"; //5
List<String> StudentC = new ArrayList<>();
StudentC.add(StudentC_1);
StudentC.add(StudentC_2);
String StudentD_1 = "00100"; //6
String StudentD_2 = "00010"; //7
List<String> StudentD = new ArrayList<>();
StudentD.add(StudentD_1);
StudentD.add(StudentD_2);
String StudentE_1 = "01000"; //8
String StudentE_2 = "00100"; //9
List<String> StudentE = new ArrayList<>();
StudentE.add(StudentE_1);
StudentE.add(StudentE_2);
guessesMap.put("A", StudentA);
guessesMap.put("B", StudentB);
guessesMap.put("C", StudentC);
guessesMap.put("D", StudentD);
guessesMap.put("E", StudentE);
List<String> guesses = guessesMap.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
int charPosition = 0;
while(answerMap.size() != 5){
if (charPosition > 4){
charPosition = 0;
}
guesses = guessesMap.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
int oneCounter = 0;
String guessHit = null;
for(String guess : guesses){
if(guess.charAt(charPosition) == '1'){
oneCounter++;
guessHit = guess;
}
}
if(oneCounter == 1){
removeInvalidGuess(guessHit);
}else{
checkAgainstAnswerMap();
}
charPosition ++;
System.out.println(answerMap);
}
System.out.println("Comparison is done");
}
private static void removeInvalidGuess(String guessHit){
for(Map.Entry<String, List<String>> entry : guessesMap.entrySet()){
if(entry.getValue().contains(guessHit)){
guessesMap.put(entry.getKey(), Arrays.asList(guessHit));
updateAnswerMap(entry.getKey(), guessHit);
}
}
}
private static void updateAnswerMap(String student, String answers){
int answerIndex = answers.indexOf("1") + 1;
switch (student){
case "A":
answerMap.put(answerIndex, SA.get(answerIndex));
break;
case "B":
answerMap.put(answerIndex, SB.get(answerIndex));
break;
case "C":
answerMap.put(answerIndex, SC.get(answerIndex));
break;
case "D":
answerMap.put(answerIndex, SD.get(answerIndex));
break;
case "E":
answerMap.put(answerIndex, SE.get(answerIndex));
break;
}
}
private static void checkAgainstAnswerMap(){
for(Map.Entry<String, List<String>> studentGuess : guessesMap.entrySet()){
String student = studentGuess.getKey();
List<String> answers = studentGuess.getValue();
if (answers.size() == 1){
return;
}
switch (student){
case "A":
for(String answer: answers){
int answerKey = answer.indexOf("1") + 1;
String studentAnswer = SA.get(answerKey);
Integer correctAnswerKey = (getKey(answerMap, studentAnswer));
if(correctAnswerKey!= null && answerKey != correctAnswerKey.intValue()){
guessesMap.get(student).remove(answer);
break;
}
}
break;
case "B":
for(String answer: answers){
int answerKey = answer.indexOf("1") + 1;
String studentAnswer = SB.get(answerKey);
Integer correctAnswerKey = (getKey(answerMap, studentAnswer));
if(correctAnswerKey!= null && answerKey != correctAnswerKey.intValue()){
guessesMap.get(student).remove(answer);
break;
}
}
break;
case "C":
for(String answer: answers){
int answerKey = answer.indexOf("1") + 1;
String studentAnswer = SC.get(answerKey);
Integer correctAnswerKey = (getKey(answerMap, studentAnswer));
if(correctAnswerKey!= null && answerKey != correctAnswerKey.intValue()){
guessesMap.get(student).remove(answer);
break;
}
}
break;
case "D":
for(String answer: answers){
int answerKey = answer.indexOf("1") + 1;
String studentAnswer = SD.get(answerKey);
Integer correctAnswerKey = (getKey(answerMap, studentAnswer));
if(correctAnswerKey!= null && answerKey != correctAnswerKey.intValue()){
guessesMap.get(student).remove(answer);
break;
}
}
break;
case "E":
for(String answer: answers){
int answerKey = answer.indexOf("1") + 1;
String studentAnswer = SE.get(answerKey);
Integer correctAnswerKey = (getKey(answerMap, studentAnswer));
if(correctAnswerKey!= null && answerKey != correctAnswerKey.intValue()){
guessesMap.get(student).remove(answer);
break;
}
}
break;
}
}
}
public static <K, V> K getKey(Map<K, V> map, V value)
{
return map.entrySet()
.stream()
.filter(entry -> value.equals(entry.getValue()))
.map(Map.Entry::getKey)
.findFirst().orElse(null);
}
}
最后结果
{1=SHANDONG, 2=HUBEI, 3=SHANXI, 4=JILIN, 5=GANSU}
A 2-陕 5-甘 ---> 5-甘
B 2-湖 4-山 ---> 2-湖
C 1-山 5-吉 ---> 1-山
D 3-湖 4-吉 ---> 4-吉
E 2-甘 3-陕 ---> 3-陕
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A、B、C、D、E 五位同学
* 1、2、3、4、5 五个省份
* <p>
* A: 2 -> 陕西 5 -> 甘肃
* B: 2 -> 湖北 4 -> 山东
* C: 1 -> 山东 5 -> 吉林
* D: 3 -> 湖北 4 -> 吉林
* E: 2 -> 甘肃 3 -> 陕西
* <p>
* 每位同学答对一个省份,并且每个编号只有一位同学答对,问1-5号省份对应的名称
*/
public class Reasoning {
/**
* 同学
*/
private static List<String> students = new ArrayList<>(5);
/**
* 城市
*/
private static Map<Integer, String> citys = new HashMap<>(5);
/**
* 证词
*/
private static Map<String, Map<Integer, String>> testimony = new HashMap<>();
public static void main(String[] args) {
Reasoning reasoning = new Reasoning();
reasoning.prove();
System.out.println("最终得出:" + citys);
}
public Reasoning() {
students = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E"));
Map<Integer, String> A = new HashMap<>();
A.put(2, "陕西");
A.put(5, "甘肃");
testimony.put("A", A);
Map<Integer, String> B = new HashMap<>();
B.put(2, "湖北");
B.put(4, "山东");
testimony.put("B", B);
Map<Integer, String> C = new HashMap<>();
C.put(1, "山东");
C.put(5, "吉林");
testimony.put("C", C);
Map<Integer, String> D = new HashMap<>();
D.put(3, "湖北");
D.put(4, "吉林");
testimony.put("D", D);
Map<Integer, String> E = new HashMap<>();
E.put(2, "甘肃");
E.put(3, "陕西");
testimony.put("E", E);
}
/**
* 开始证明
* <p>
* 1.假设 A 答对 第一句
*/
private void prove() {
boolean check = true;
for (String student : students) {
Map<Integer, String> city = testimony.get(student);
boolean flag = false;
for (Integer cityCode : city.keySet()) {
String tempCityName = city.get(cityCode);
if (checkCity(student, cityCode, tempCityName)) {
flag = true;
break;
}
}
if (!flag) {
check = false;
System.out.println("学生" + student + "证词" + city + "没有得到验证。");
break;
}
}
// 冲突,前面假设出错
if (!check) {
citys.clear();
System.out.println("前期猜想出错,重新开始!");
revisionStu();
prove();
}
}
/**
* 验证猜想
*
* @param student 学生
* @param cityCode 城市代码
* @param tempCityName 城市名称
* @return 是否符合验证
*/
private boolean checkCity(String student, Integer cityCode, String tempCityName) {
String cityName = citys.get(cityCode);
if ((cityName == null || cityName.equals(tempCityName)) && !citys.containsValue(tempCityName)) {
citys.put(cityCode, tempCityName);
System.out.println("学生" + student + "证词:" + cityCode + "是" + tempCityName);
return true;
}
return false;
}
/**
* 调整学生顺序
*/
private void revisionStu() {
String stu = students.get(0);
students.remove(stu);
students.add(stu);
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Test03 {
public static void main(String[] args) {
String[][] src = {
{"2", "陕", "5", "甘"},
{"2", "湖", "4", "山"},
{"1", "山", "5", "吉"},
{"3", "湖", "4", "吉"},
{"2", "甘", "3", "陕"},
};
List<String> list1 = Arrays.asList("1", "0");
List<List<String>> list = new ArrayList();
list.add(list1);
list.add(list1);
list.add(list1);
list.add(list1);
list.add(list1);
List<List<String>> result = new ArrayList<List<String>>();
descartes(list, result, 0, new ArrayList<String>());
Map<String, String> map = new HashMap();
Set<String> set = new HashSet();
a: for(List<String> res: result){
map = new HashMap();
set = new HashSet();
for(int i = 0; i < res.size(); i++){
if("1".equals(res.get(i)))
map.put(src[i][0], src[i][1]);
else
map.put(src[i][2], src[i][3]);
}
if(map.size() < 5)
continue;
set.addAll(map.values());
if(set.size() < 5)
continue;
for(int i = 0; i < res.size(); i++){
if("0".equals(res.get(i))){
if(map.get(src[i][0]).equals(src[i][1])){
continue a;
}
}else{
if(map.get(src[i][2]).equals(src[i][3])){
continue a;
}
}
}
prt(src, res);
}
}
private static void prt(String[][] src, List<String> list){
for(int i = 0; i < list.size(); i++){
if("1".equals(list.get(i)))
System.out.print(src[i][0] + "-" + src[i][1] + ", ");
else
System.out.print(src[i][2] + "-" + src[i][3] + ", ");
}
System.out.println();
}
private static void descartes(List<List<String>> dimvalue, List<List<String>> result, int layer, List<String> curList) {
if (layer < dimvalue.size() - 1) {
if (dimvalue.get(layer).size() == 0) {
descartes(dimvalue, result, layer + 1, curList);
} else {
for (int i = 0; i < dimvalue.get(layer).size(); i++) {
List<String> list = new ArrayList<String>(curList);
list.add(dimvalue.get(layer).get(i));
descartes(dimvalue, result, layer + 1, list);
}
}
} else if (layer == dimvalue.size() - 1) {
if (dimvalue.get(layer).size() == 0) {
result.add(curList);
} else {
for (int i = 0; i < dimvalue.get(layer).size(); i++) {
List<String> list = new ArrayList<String>(curList);
list.add(dimvalue.get(layer).get(i));
result.add(list);
}
}
}
}
}
if(A的第一句是对的){
if(B的第一句是对的){
if(C的第一句是对的){
if(D的第一句是对的){
if(E的第一句是对的){
//验证合理性
}else{ //E的第二句的是对的
//验证合理性
}
}else{ //D的第二句的是对的
}
}else{ //C的第二句的是对的
}
}else{ //A的第二句是对的
}
}else{ //A的第二句是对的
}