给聪明的你解解闷

给聪明的你解解闷

虽是小学题目,但是完全可以作为一道模拟的算法题来解决,甚至可以作为面试题,自己动手写的时候考虑得还是比较多的,不信你们也可以试试,下面是笔者的实现代码,快把你们的代码也晒出来吧。

// 6087 5173 1358 3825 2531
int[][] num = new int[][]{
        {6, 0, 8, 7},
        {5, 1, 7, 3},
        {1, 3, 5, 8},
        {3, 8, 2, 5},
        {2, 5, 3, 1}
};
for (int i = 0; i < 10000; ++i) {
    // 取出个十百千位
    int g = i % 10;
    int s = (i / 10) % 10;
    int b = (i / 100) % 10;
    int q = (i / 1000) % 10;
    // 是否是最终答案标志位
    boolean isRight = true;
    // 筛选出只出现两次的,并且本次当前位置不对
    for (int j = 0; j < 5; j++) {
        int count = 0;
        for (int k = 0; k < 4; k++) {
            if ((g == num[j][k] && k != 3)
                    || (s == num[j][k] && k != 2)
                    || (b == num[j][k] && k != 1)
                    || (q == num[j][k] && k != 0)) {
                ++count;
            }
        }
        // 如果不是出现两次的直接跳出
        if (count != 2) {
            isRight = false;
            break;
        }
    }
    if (isRight) {
        // 下面要判断所有位置都要是错误的
        for (int j = 0; j < 5; j++) {
            if (g == num[j][3] || s == num[j][2] || b == num[j][1] || q == num[j][0]) {
                isRight = false;
                break;
            }
        }
    }
    if (isRight) {
        // 到此才算是正确答案:8712
        System.out.println(i);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容