美文网首页
逻辑练习《10题解答》

逻辑练习《10题解答》

作者: w_左拖拖 | 来源:发表于2017-05-26 19:55 被阅读0次

    源于《三个变态的循环》第三题

    原文链接http://www.cn-java.com/www1/bbs/viewthread.php?tid=93104&extra=page=1

    用程序求解:
    请回答下面10个问题:
    1、第一个答案是b的问题是哪一个?;
    (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 (注:a和b相差一个字母)
    8、答案是元音字母的问题的个数是:
    (a)2;(b)3;(c)4;(d)5;(e)6 (注:a和e是元音字母)
    9、答案是辅音字母的问题的个数是:
    (a)一个质数;(b)一个阶乘数;(c)一个平方数;(d)一个立方数,(e)5的倍数
    10、本问题的答案是:
    (a)a;(b)b;(c)c;(d)d;(e)e

    非常晕的一个题目。第一个想到的就是枚举出所有可能的情况然后判断是否满足上面10个条件,先上代码。

    public class Demo {
        public static final char DEFAULT_CHAR = 'a';
    
        public String[][] QA = null;
    
        private char[] answer = null;
    
        public void go() {
            init();
            answer = new char[10];
            for (char i = 'a'; i <= 'e'; i++) {
                answer[0] = i;
                for (char j = 'a'; j <= 'e'; j++) {
                    answer[1] = j;
                    for (char m = 'a'; m <= 'e'; m++) {
                        answer[2] = m;
                        for (char n = 'a'; n <= 'e'; n++) {
                            answer[3] = n;
                            for (char a = 'a'; a <= 'e'; a++) {
                                answer[4] = a;
                                for (char b = 'a'; b <= 'e'; b++) {
                                    answer[5] = b;
                                    for (char c = 'a'; c <= 'e'; c++) {
                                        answer[6] = c;
                                        for (char d = 'a'; d <= 'e'; d++) {
                                            answer[7] = d;
                                            for (char e = 'a'; e <= 'e'; e++) {
                                                answer[8] = e;
                                                for (char f = 'a'; f <= 'e'; f++) {
                                                    answer[9] = f;
                                                    if (matcher()) System.out.println(answer);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    
        /**
         * 初始化所有问题的答案
         */
        private void init() {
            QA = new String[10][5];
            QA[0] = new String[]{"2", "3", "4", "5", "6"};
            QA[1] = new String[]{"2,3", "3,4", "4,5", "5,6", "6,7"};
            QA[2] = new String[]{"1", "2", "4", "7", "6"};
            QA[3] = new String[]{"0", "1", "2", "3", "4"};
            QA[4] = new String[]{"10", "9", "8", "7", "6"};
            QA[5] = new String[]{"b", "c", "d", "e", "a"};
            QA[6] = new String[]{"4", "3", "2", "1", "0"};
            QA[7] = new String[]{"2", "3", "4", "5", "6"};
            QA[8] = new String[]{"a", "b", "c", "d", "e"};
            QA[9] = new String[]{"a", "b", "c", "d", "e"};
        }
    
        private boolean matcher() {
            return No1() && No2() && No3() && No4() && No5() && No6() && No7() && No8() && No9();
        }
    
        /**
         * 1、第一个答案是b的问题是哪一个?
         */
        private boolean No1() {
            int n = indexOf('b');
            return n > -1 && n + 1 == QA[0][getAns(1)].charAt(0) - '0';
        }
    
        /**
         * 2、唯一的连续两个具有相同答案的问题是:
         */
        private boolean No2() {
            int cnt = 0, idx = 0;
            while (idx < answer.length - 1) {
                if (answer[idx] == answer[++idx]) {
                    cnt++;
                }
            }
            if (cnt != 1) return false;
            String ans = QA[1][getAns(2)];
            return answer[ans.charAt(0) - '0' - 1] == answer[ans.charAt(2) - '0' - 1];
        }
    
        /**
         * 3、本问题答案和哪一个问题的答案相同?
         */
        private boolean No3() {
            return answer[QA[2][getAns(3)].charAt(0) - '0' - 1] - DEFAULT_CHAR == getAns(3);
        }
    
        /**
         * 4、答案是a的问题的个数是:
         */
        private boolean No4() {
            return QA[3][getAns(4)].charAt(0) - '0' - 1 == countChar(DEFAULT_CHAR);
        }
    
        /**
         * 5、本问题答案和哪一个问题的答案相同?
         */
        private boolean No5() {
            return answer[QA[4][getAns(5)].charAt(0) - '0' - 1] - DEFAULT_CHAR == getAns(5);
        }
    
        /**
         * 6、答案是a的问题的个数和答案是什么的问题的个数相同?
         */
        private boolean No6() {
            return countChar(DEFAULT_CHAR) == countChar(QA[5][getAns(6)].charAt(0));
        }
    
        /**
         * 7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?
         */
        private boolean No7() {
            return Math.abs(answer[6] - answer[7]) == QA[6][getAns(7)].charAt(0) - '0';
        }
    
        /**
         * 8、答案是元音字母的问题的个数是:
         */
        private boolean No8() {
            int c = countChar(DEFAULT_CHAR) + countChar('e');
            return QA[7][getAns(8)].charAt(0) - '0' == c;
        }
    
        /**
         * 9、答案是辅音字母的问题的个数是:
         */
        private boolean No9() {
            int c = answer.length - countChar(DEFAULT_CHAR) - countChar('e');
            boolean v;
            switch (getAns(9)) {
                case 0:
                    v = (c == 2 || c == 3 || c == 5 || c == 7);
                    break;
                case 1:
                    v = (c == 0 || c == 2 || c == 6);
                    break;
                case 2:
                    v = (c == 1 || c == 4 || c == 9);
                    break;
                case 3:
                    v = (c == 1 || c == 8);
                    break;
                case 4:
                    v = (c % 5 == 0);
                    break;
                default:
                    v = false;
            }
            return v;
        }
    
        /**
         * 计算字符串中有多少个指定字符
         */
        public int countChar(char c) {
            int count = 0;
            for (char cc : answer) {
                if (cc == c) {
                    count++;
                }
            }
            return count;
        }
    
        /**
         * 取得本题答案
         */
        public int getAns(int index) {
            return answer[index - 1] - DEFAULT_CHAR;
        }
    
        public int indexOf(char c) {
            for (int i = 0; i < answer.length; i++) {
                if (answer[i] == c) {
                    return i;
                }
            }
            return -1;
        }
    
    
        /**
         * 测试代码
         */
        public static void main(String[] args) {
            new Demo().go();
        }
    }
    

    最后得到两组满足条件的组合abddaedcbe,cdebeedcbe

    相关文章

      网友评论

          本文标题:逻辑练习《10题解答》

          本文链接:https://www.haomeiwen.com/subject/cwrxfxtx.html