八皇后问题(由字符串排列问题拓展)
2017-03-23 20:06
351 查看
题目:在8x8的国际象棋上摆放着8歌皇后,使其不能互相攻击,即任意两个皇后不得处在同一行,同一列或者同一条对角线上。如下图,请问一共有多少中符合条件的摆法?
分析:八皇后问题其实可以看做字符串排列问题的一种扩展,先将0~7个数进行排列,然后从这么多个排列中选择出条件符合的情况保留下来。
思路:先遍历出所有的情况,不论是符合条件的还是不符合条件的,然后再筛选由于8个皇后的任意两个不能处于同一行,那么说明每个皇后占据一行。于是定义一个数组ColumnIndex[8],数组中的数字代表第i行的皇后的列号。先把数组ColumnIndex的8个数字分别用0~7初始化,然后对这8个数字做全排列。因为我们是用不同的数字初始化数组所以任意两个皇后肯定不在同一列。我们只需判断每一个排列对应的8个皇后是不是在同一对角线上,也就是对于数组ColumnIndex的两个下标i和j,是不是i-j==ColumnIndex[i]-ColumnIndex[j] 或者 j-i==ColumnIndex[i]-ColumnIndex[j],如果是的话就说明这种排列不符合情况。
因为八皇后问题可以看做字符串排列问题的拓展,所以如果需要的话请参考:字符串排列问题
代码如下:
代码结果如下:
一共有40320种排列情况
符合条件的有92个:
[04752613, 05726314, 06357142, 06471352, 13572064, 14602753, 14630752, 15063724, 15720364, 16257403, 16470352, 17502463, 20647135, 24170635, 24175360, 24603175, 24730615, 25147063, 25160374, 25164073, 25307461, 25317460, 25703641, 25704613, 25713064, 26174035, 26175304, 27360514, 30471625, 30475261, 31475026, 31625704, 31625740, 31640752, 31746025, 31750246, 35041726, 35716024, 35720641, 36074152, 36271405, 36415027, 36420571, 37025164, 37046152, 37420615, 40357162, 40731625, 40752613, 41357206, 41362750, 41506372, 41703625, 42057136, 42061753, 42736051, 46027531, 46031752, 46137025, 46152037, 46152073, 46302751, 47302516, 473061
4000
52, 50417263, 51602473, 51603742, 52064713, 52073164, 52074136, 52460317, 52470316, 52613704, 52617403, 52630714, 53047162, 53174602, 53602417, 53607142, 57130642, 60275314, 61307425, 61520374, 62057413, 62714053, 63147025, 63175024, 64205713, 71306425, 71420635, 72051463, 73025164]
分析:八皇后问题其实可以看做字符串排列问题的一种扩展,先将0~7个数进行排列,然后从这么多个排列中选择出条件符合的情况保留下来。
思路:先遍历出所有的情况,不论是符合条件的还是不符合条件的,然后再筛选由于8个皇后的任意两个不能处于同一行,那么说明每个皇后占据一行。于是定义一个数组ColumnIndex[8],数组中的数字代表第i行的皇后的列号。先把数组ColumnIndex的8个数字分别用0~7初始化,然后对这8个数字做全排列。因为我们是用不同的数字初始化数组所以任意两个皇后肯定不在同一列。我们只需判断每一个排列对应的8个皇后是不是在同一对角线上,也就是对于数组ColumnIndex的两个下标i和j,是不是i-j==ColumnIndex[i]-ColumnIndex[j] 或者 j-i==ColumnIndex[i]-ColumnIndex[j],如果是的话就说明这种排列不符合情况。
因为八皇后问题可以看做字符串排列问题的拓展,所以如果需要的话请参考:字符串排列问题
代码如下:
/** * */ package problem2; import java.util.ArrayList; import java.util.List; /** * @author Hutongling * * @time:2017年3月22日 下午8:54:50 */ public class 八皇后问题 { /** * @param base 以该字符串作为基础字符串,进行选择性组合。 * @param buff 所求字符串的临时结果 * @param result 存放所求结果 */ public static List<String> list(String base,String buff){ List<String> result = new ArrayList<String>();//存放结果信息。 if(base.length()<=0) result.add(buff); for(int i=0;i<base.length();i++){ List<String> temp = list(new StringBuffer(base).deleteCharAt(i).toString(),buff+base.charAt(i)); result.addAll(temp); } return result; } public static boolean judgeQueuen(int[] data){ for(int i=0;i<data.length;i++) for(int j=i+1;j<data.length;j++) { if(i-j==data[i]-data[j] || j-i==data[i]-data[j]) return false; } return true; } public static void main(String[] args) { String s = "01234567";// 原字符串 if (s == null || s.length() == 0) System.out.println("请输入字符串"); else { List<String> result = list(s, "");// 列出字符的组合,放入result System.out.print("一共有"+result.size()+"种排列情况\n"); List<String> result2=new ArrayList<String>(); count=0; int Columnindex[]={0,0,0,0,0,0,0,0}; boolean flag; for(int i=0;i<result.size();i++){ Columnindex[0]=result.get(i).charAt(0)-'0'; Columnindex[1]=result.get(i).charAt(1)-'0'; Columnindex[2]=result.get(i).charAt(2)-'0'; Columnindex[3]=result.get(i).charAt(3)-'0'; Columnindex[4]=result.get(i).charAt(4)-'0'; Columnindex[5]=result.get(i).charAt(5)-'0'; Columnindex[6]=result.get(i).charAt(6)-'0'; Columnindex[7]=result.get(i).charAt(7)-'0'; flag=judgeQueuen(Columnindex); if(flag==true){ count++; result2.add(result.get(i)); } } System.out.println("符合条件的有" + count+ "个:"); System.out.println(result2); } } }
代码结果如下:
一共有40320种排列情况
符合条件的有92个:
[04752613, 05726314, 06357142, 06471352, 13572064, 14602753, 14630752, 15063724, 15720364, 16257403, 16470352, 17502463, 20647135, 24170635, 24175360, 24603175, 24730615, 25147063, 25160374, 25164073, 25307461, 25317460, 25703641, 25704613, 25713064, 26174035, 26175304, 27360514, 30471625, 30475261, 31475026, 31625704, 31625740, 31640752, 31746025, 31750246, 35041726, 35716024, 35720641, 36074152, 36271405, 36415027, 36420571, 37025164, 37046152, 37420615, 40357162, 40731625, 40752613, 41357206, 41362750, 41506372, 41703625, 42057136, 42061753, 42736051, 46027531, 46031752, 46137025, 46152037, 46152073, 46302751, 47302516, 473061
4000
52, 50417263, 51602473, 51603742, 52064713, 52073164, 52074136, 52460317, 52470316, 52613704, 52617403, 52630714, 53047162, 53174602, 53602417, 53607142, 57130642, 60275314, 61307425, 61520374, 62057413, 62714053, 63147025, 63175024, 64205713, 71306425, 71420635, 72051463, 73025164]
相关文章推荐
- 字符串排列问题拓展
- 字符串数组的全排列到八皇后问题详解
- 字符串的排列组合问题
- 字符串的全排列和所有组合问题
- 《剑指offer》刷题笔记(分解让复杂问题简单):字符串的排列
- 海涛老师的面试题-作业28-字符串的排列组合问题。
- 常量字符串的排列问题
- 字符串的全排列和组合算法(扩展:八皇后问题)
- 解题笔记(21)——字符串的排列组合问题
- 字符串的排列组合及其扩展问题
- java实现字符串排列组合问题
- 字符串全排列问题二
- 字符串排列组合问题&递归算法(1)
- 字符串的排列组合问题
- 字符串的排列组合问题
- 【剑指offer】4.4分解让复杂问题简单化——面试题28:字符串的排列
- JAVA: 字符串的排列和组合问题
- 字符串的排列组合问题-java
- 字符串的排列组合问题
- C基础/指定长度的字符串排列问题