[C趣味编程]地理省份的问题[部分]

问题:

地理课上老师给出一张没有说明省份的中国地图,从中选出 个省从1―5编号,要大家写出省份的名称。交卷后有五位同学A,B,C,D,E,其中每人只给出了俩个省份的名称。它们的回答内容如下:
A答:2号浙江,5号江苏;
B答:2号湖北,4号山东;
C答:1号山东,5号湖南;
D答:3号湖北,4号湖南;
E答:2号江苏,3号浙江。
已知五位同学中没人只回答对了一个省份名称,编程判断编号为1到5的五个省份的名称。

 

思想:遍历所有可能的省份组合,对每种组合,进行验证。(注意所有答案加起来也就5个省份,可以使用全排列,加入全部答案共有8个省份,但其实省份只有5个,则参考<< 全排列算法(只求前x位有多少种取值情况) >>)

 

第一种方法:循环找出所有省份组合,每找出一个,对其验证。

public class Map {
    public static void main(String[] args) {
        String[] province1 = { "浙江", "湖南", "山东", "湖北", "江苏" };
        String[] province2 = new String[5];
        for (int i = 0; i <= 4; i++) {
            province2[0] = province1[i];
            for (int j = 0; j <= 4; j++) {
                if (j != i) {
                    province2[1] = province1[j];
                    for (int k = 0; k <= 4; k++) {
                        if (i != k && j != k) {
                            province2[2] = province1[k];
                            for (int m = 0; m <= 4; m++) {
                                if (i != m && j != m && k != m) {
                                    province2[3] = province1[m];
                                    for (int n = 0; n <= 4; n++) {
                                        if (i != n && j != n && k != n && m != n) {
                                            province2[4] = province1[n];
                                            //枚举出一种省份的方案后,进行验证
                                            if ((province2[1] == "浙江") ^ (province2[4] == "江苏"))//true^false =true
                                                continue;
                                            if ((province2[1] == "湖北") ^ (province2[3] == "山东"))
                                                continue;
                                            if ((province2[0] == "山东") ^ (province2[4] == "湖南"))
                                                continue;
                                            if ((province2[2] == "湖北") ^ (province2[3] == "湖南"))
                                                continue;
                                            if ((province2[1] == "江苏") ^ (province2[2] == "浙江"))
                                                continue;
                                            for (int a = 0; a <= 4; a++) {
                                                System.out.println("第" + (a + 1) + "个省份是:"
                                                        + province2[a]);
                                                if (a == 4)
                                                    System.out
                                                            .println("***********************************");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

第二种方法:全排列等价于所有省份的组合,每找出一个排列方式,就是找出一种组合,对其验证。 (其实,全排列有2种实现方式,一种是下面的递归,一种就是上面的for循环)

 

public class QuanPailie {

    static String[] provinces = { "浙江", "湖南", "山东", "湖北", "江苏" };
    static int      Zhejiang  = 0;
    static int      Hunan     = 1;
    static int      Shandong  = 2;
    static int      Hubei     = 3;
    static int      Jiangsu   = 4;

    public static void swap(int[] array, int a, int b) {
        if (a == b) {
            return;
        }
        array[a] = array[a] ^ array[b];
        array[b] = array[a] ^ array[b];
        array[a] = array[a] ^ array[b];
    }

    /**
     * 找到一种省份对应[1-5]号的排列方案后,进行验证,验证通过则打印
     */
    public static void process(int[] province) {
        //枚举出一种省份的方案后,进行验证
        if ((province[1] == Zhejiang) ^ (province[4] == Jiangsu))//true^false =true
            return;
        if ((province[1] == Hubei) ^ (province[3] == Shandong))
            return;
        if ((province[0] == Shandong) ^ (province[4] == Hunan))
            return;
        if ((province[2] == Hubei) ^ (province[3] == Hunan))
            return;
        if ((province[1] == Jiangsu) ^ (province[2] == Zhejiang))
            return;
        for (int a = 0; a <= 4; a++) {
            System.out.println("第" + (a + 1) + "个省份是:" + provinces[province[a]]);
            if (a == 4)
                System.out.println("***********************************");
        }
    }

    
    public static void allRank(int[] array, int begin, int length) {
        if (begin == length - 1) {
            process(array);
        } else {
            for (int i = begin; i < length; i++) {
                swap(array, begin, i);
                allRank(array, begin + 1, length);
                swap(array, i, begin);
            }
        }
    }

    public static void main(String[] args) {
        int[] province = { Zhejiang, Hunan, Shandong, Hubei, Jiangsu };
        allRank(province, 0, 5);
    }
}
 

 

 

 

效果:

第1个省份是:浙江
第2个省份是:湖南
第3个省份是:山东
第4个省份是:江苏
第5个省份是:湖北
***********************************
第1个省份是:浙江
第2个省份是:湖南
第3个省份是:江苏
第4个省份是:湖北
第5个省份是:山东
***********************************
第1个省份是:浙江
第2个省份是:山东
第3个省份是:湖南
第4个省份是:江苏
第5个省份是:湖北
***********************************
第1个省份是:湖南
第2个省份是:浙江
第3个省份是:山东
第4个省份是:湖北
第5个省份是:江苏
***********************************
第1个省份是:湖南
第2个省份是:山东
第3个省份是:江苏
第4个省份是:浙江
第5个省份是:湖北
***********************************
第1个省份是:湖南
第2个省份是:山东
第3个省份是:江苏
第4个省份是:湖北
第5个省份是:浙江
***********************************
第1个省份是:湖南
第2个省份是:湖北
第3个省份是:江苏
第4个省份是:山东
第5个省份是:浙江
***********************************
第1个省份是:湖南
第2个省份是:江苏
第3个省份是:浙江
第4个省份是:湖北
第5个省份是:山东
***********************************
第1个省份是:山东
第2个省份是:江苏
第3个省份是:浙江
第4个省份是:湖北
第5个省份是:湖南
***********************************
第1个省份是:湖北
第2个省份是:湖南
第3个省份是:山东
第4个省份是:江苏
第5个省份是:浙江
***********************************
第1个省份是:湖北
第2个省份是:湖南
第3个省份是:江苏
第4个省份是:浙江
第5个省份是:山东
***********************************
第1个省份是:湖北
第2个省份是:山东
第3个省份是:湖南
第4个省份是:江苏
第5个省份是:浙江
***********************************
第1个省份是:江苏
第2个省份是:湖南
第3个省份是:山东
第4个省份是:浙江
第5个省份是:湖北
***********************************
第1个省份是:江苏
第2个省份是:湖南
第3个省份是:山东
第4个省份是:湖北
第5个省份是:浙江
***********************************
第1个省份是:江苏
第2个省份是:山东
第3个省份是:湖南
第4个省份是:浙江
第5个省份是:湖北
***********************************
第1个省份是:江苏
第2个省份是:山东
第3个省份是:湖南
第4个省份是:湖北
第5个省份是:浙江
***********************************
第1个省份是:江苏
第2个省份是:山东
第3个省份是:湖北
第4个省份是:湖南
第5个省份是:浙江
***********************************
第1个省份是:江苏
第2个省份是:湖北
第3个省份是:湖南
第4个省份是:山东
第5个省份是:浙江
***********************************

你可能感兴趣的:(编程,C++,c,C#,J#)