问题:
地理课上老师给出一张没有说明省份的中国地图,从中选出五 个省从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个省份是:浙江
***********************************