/*
(a)2;(b) 3;(c)4;(d)5;(e)6
2、唯一的连续两个具有相同答案的问题是:
(a)2,3;(b)3,4;(c)4,5;(d)5,6;(e)6,7;
3、本问题答案和哪一个问题的答案相同?
(a)1;(b)2;(c)4;(d)7;(e)6
4、答案是a的问题的个数是:
(a)0;(b)1;(c)2;(d)3;(e)4
5、本问题答案和哪一个问题的答案相同?
(a)10;(b)9;(c)8;(d)7;(e)6
6、答案是a的问题的个数和答案是什么的问题的个数相同?
(a)b;(b)c;(c)d;(d)e;(e)以上都不是
7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?
(a)4;(b)3;(c)2;(d)1;(e)0。
8、答案是元音字母的问题的个数是:
(a)2;(b)3;(c)4;(d)5;(e)6。
9、答案是辅音字母的问题的个数是:
(a)一个质数;(b)一个阶乘数;(c)一个平方数;(d)一个立方数,(e)5的倍数
10、本问题的答案是:
(a)a;(b)b;(c)c;(d)d;(e)e
*/
个人解答:
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(,9); //ma.showAns(); ma.show(); } } class MyAns{ int[] ans = new int[10];//答案的数字化数组 TreeMap
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<;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
showMap(int[] ins){//把已知数组装到map中 //存储每一个答案出现的次数,比如a出现几次,b出现几次 TreeMap
tm = new TreeMap
(); 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); } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/174094.html原文链接:https://javaforall.net
