您的位置:首页 > 其它

八皇后问题(由字符串排列问题拓展)

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],如果是的话就说明这种排列不符合情况。

因为八皇后问题可以看做字符串排列问题的拓展,所以如果需要的话请参考:字符串排列问题

代码如下:

/**
*
*/
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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后