楼主,就让我来给你一个满意的答案好了,希望楼主能认真看看我的代码--
个人解答:- import java.util.Arrays;
- import java.util.TreeMap;
- public class MyDemo1 {
- /**
- * @param args
- */
- public static void main(String[] args) {
-
- MyAns ma = new MyAns();
- //System.out.println(ma.ans);
- //ma.get5(9765624,9);
- //ma.showAns();
- ma.show();
- }
- }
- class MyAns{
-
- int[] ans = new int[10];//答案的数字化数组
- TreeMap<Integer, Integer> tm;//存储每一个答案出现的次数,比如a出现几次,b出现几次
- int[][] ques = {//数字化每一道题目,题目的编号从0开始计算,方便数组遍历。
- //同理,答案a,b,c,d,e也从0开始计算。
- {1,2,3,4,5},//0
- {1,2,3,4,5},//1
- {0,1,3,6,5},//2
- {0,1,2,3,4},//3
- {9,8,7,6,5},//4
- {1,2,3,4,5},//5
- {4,3,2,1,0},//6
- {2,3,4,5,6},//7
- {0,1,2,3,4},//8
- {0,1,2,3,4}};//9
-
- public void show() {//解决问题的核心部分。
- System.out.println("start");
- for(int i=0;i<9765625;i++){//遍历每一种情况的可能性
- get5(i,9);
- tm = showMap(ans);
- //showAns();
- int num8 = mget(1)+mget(2)+mget(3);
- if((firB()==ques[0][ans[0]])
- &&(sec()==ques[1][ans[1]])
- &&(ans[2]==ans[ques[2][ans[2]]])
- &&(mget(0)==ques[3][ans[3]])
- &&(ans[4]==ans[ques[4][ans[4]]])
- &&(isFive(ques[5][ans[5]]))
- &&(Math.abs(ans[6]-ans[7])==ques[6][ans[6]])
- &&(mget(0)+mget(4)==ques[7][ans[7]])
- &&(isEight(num8, ques[8][ans[8]]))
- &&(ans[9]==ques[9][ans[9]])){//判断每一种可能性的每一道题目是否符合答案
- showAns();//打印出满足所有题目的答案数组
- }
-
- }
- System.out.println("end");
- }
- public void showAns(){//打印出答案的数组
- Character[] chs = new Character[10];
- for(int i =0;i<10;i++){
- chs[i]=(char)(ans[i]+'a');
- }
-
- System.out.println(Arrays.asList(chs).toString());
- }
-
- public TreeMap<Integer, Integer> showMap(int[] ins){//把已知数组装到map中
- //存储每一个答案出现的次数,比如a出现几次,b出现几次
- TreeMap<Integer, Integer> tm = new TreeMap<Integer, Integer>();
- for (int c : ins){
- Integer value = tm.get(c);
- if(value == null)
- value = 0;
- value++;
- tm.put(c, value);
- }
-
- return tm;
- }
-
- public void get5(int num,int count){//把十进制转换为五进制,存到int数组中,得到的就是
- //每一道题目的答案值(0=a,1=b,2=c,3=d,4=e).
- int x = num/5;
- if(x>0){
- get5(x,count-1);
- }
- ans[count] = num%5;
- //System.out.println(ans[count]);
- }
-
- public int firB(){//第一个答案是b的问题是哪一个
- for(int i=0;i<10;i++){
- if(ans[i]==1)
- return i;
- }
- return -1;
- }
-
- public int sec(){//返回第一个 两个答案相同的 数值
- int count = 0;
- int x = -1;
- for(int i = 0;i<9;i++){
- if(ans[i]==ans[i+1]){//连续2个问题的答案相同
- count++;//确保个数唯一
- x = i;}
- }
-
- if(!(count==1))//判断唯一的一个
- return -1;//不唯一的情况
- else
- return x;//唯一的情况
- }
-
- public boolean isEight(int num, int in){
- int[][] num8s = {{2,3,5,7},//一个质数的可能性
- {1,2,6},//一个阶数的可能性
- {1,4,9},//一个平方数的可能性
- {1,8},//一个立方数的可能性
- {0,5}}; //5的倍数的可能性。
-
- int[] ints = num8s[in];
- for(int i : ints){
- if(num == i)
- return true;
- }
- return false;
- }
-
- public boolean isFive(int num){//角标5号的问题,需要分情况判断
- if(num<5)//答案是前4个的情况
- return mget(0)==mget(ques[5][ans[5]]);
- else{//以上都不是的情况
- for(int i=1; i<5;i++){
- if(mget(0)==mget(i))
- return false;
- }
- return true;
- }
- }
- public int mget(Integer i){//封装tm的get()方法 返回值为null的情况,
- //否则,null与数字不能相加,也不能用于 == 的判断。
- if(tm.get(i)==null)
- return 0;
- return tm.get(i);
-
- }
- }
复制代码 |