import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* 求解N皇后问题,用一个N位的N进制数表示棋盘上皇后的位置。 比如N=8时:45615353 表示:第0列皇后在第4个位置, 第1列皇后在第5个位置,
* 第2列皇后在第6个位置 ,...,第7列皇后在第3个位置。循环变量从 00000000 加到 77777777
* (8进制数)的过程,就遍历了皇后所有的情况。程序中用八进制数用一个一维数组 data[]表示,横列冲突:data ==
* data[j],斜列冲突:(data+i) == (data[j]+j) 或者 (data-i) == (data[j]-j)。
*
*/
public class Queen {
private static final int N = 8;
private int[][] arr = new int[N][N];
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
Queen queen = new Queen();
int count = queen.solve();
System.out.println("共有" + count + "个解。");
long endTime = System.currentTimeMillis();
System.out.println("运行时间为:" + (endTime - startTime) + "ms");
}
// 求出所有解法
public int solve() {
int count = 0;
Scanner sc = new Scanner(System.in);
for (int t = 0; t < Math.pow(N, N); t++) {
initArr();
int[] data = intToArr(t);// 一维数组 data[]表示所有皇后的位置
if (judgeArr(data)) {
for (int i = 0; i < N; i++) {
arr[i][data[i]] = 1;
}
count++;
System.out.println("第" + count + "个解:");
print();
System.out.println("键入enter求下一个解。");
if (sc.nextLine() != null) {
continue;
}
}
}
return count;
}
// 判断矩阵是否符合条件
private boolean judgeArr(int[] data) {
boolean flag = true;
Map<Integer, Integer> map = new HashMap<Integer, Integer>(N);
Map<Integer, Integer> subMap = new HashMap<Integer, Integer>(N);
Map<Integer, Integer> sumMap = new HashMap<Integer, Integer>(N);
map.clear();
subMap.clear();
sumMap.clear();
for (int i = 0; i < data.length; i++) {
// 检测冲突,排除列冲突,使每一列只放一个皇后
if (!map.containsValue(data[i])) {
map.put(i, data[i]);
int sub = map.get(i) - i;
int sum = map.get(i) + i;
// 排除"\"方向斜列冲突
if (!subMap.containsValue(sub)) {
subMap.put(i, sub);
} else {
flag = false;
break;
}
// 排除"/"方向斜列冲突
if (!sumMap.containsValue(sum)) {
sumMap.put(i, sum);
} else {
flag = false;
break;
}
} else {
flag = false;
break;
}
}
return flag;
}
// 初始化矩阵
private void initArr() {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = 0;
}
}
}
// 将0~Math.pow(W, W)的数转换为W位W进制的数
private int[] intToArr(int n) {
String str = Integer.toString(n, N);
while (str.length() < N) {
str = "0" + str;
}
char[] c = str.toCharArray();
int[] data = new int[N];
for (int i = 0; i < c.length; i++) {
data[i] = Integer.parseInt(c[i] + "");
}
return data;
}
// 打印矩阵中的数据
private void print() {
// System.out.println("矩阵中的数据:");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(" " + arr[i][j]);
}
System.out.println();
}
}
}
分享到:
相关推荐
人工智能作业-八皇后问题求解算法设计与实现+源代码+文档说明 - 小白不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分...
八皇后问题的C++算法,可以求解任意N维皇后问题。谢谢下载
这是通过遗传算法求解八皇后问题的例子(比较经典) 步骤: 1,先是随机生成一定种群数量的染色体; 2,从种群中选择较为优秀的染色体个体; 3,按顺序让两个父染色体生成两个子染色体,理论上,子染色体会随着...
八皇后求解问题。
自己根据拉斯维加斯算法,写的一个用来求解八皇后问题的python程序,其中可以自定义棋盘大小,显示程序的执行时间。
通过上述方法,我们可以利用C++实现这些算法来解决八皇后问题,并比较它们在解决复杂度、收敛速度和解质量方面的性能。同时,这样的实践有助于深入理解这些优化算法的工作原理及其在实际问题中的应用。
"八皇后问题求解的C语言程序的实现" 八皇后问题是计算机科学中一个古老的搜索问题,它可以用递归算法来实现。在这个问题中,我们需要在一个 8*8 的棋盘上放置 8 个皇后,使得每一行、每一列和每一对角线上最多只有...
计算机算法 在VC6.0环境下实现八皇后问题求解.动画演示.
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...
用滚轮盘的方法,以及自己设立了一个适应度函数,来用遗传算法解决八皇后问题。
一个古老的问题,八皇后问题,对于初学者可以看看
八皇后问题的MonteCarlo算法与回溯法的混合实现,代码精确实现,实验报告或者说论文有详细的阐述!
用简单遗传算法求解8皇后问题,每次输出一代染色体中最好和最差个体的适应度,当求的解时便将解输出,解依次为0到7行哪一列放棋子,只是简单的熟悉一下遗传算法,代码没有写注释,如果有问题与我讨论就发邮件吧,...
八数码问题,又称为8皇后问题,是一个经典的回溯法和搜索算法的应用实例。在这个问题中,目标是在一个8×8的棋盘上放置八个皇后,使得任何两个皇后都无法在同一行、同一列或同一对角线上互相攻击。这是一个典型的...
回溯算法是一种用于求解问题的搜索技术,适用于解决多解或无解的问题,如八皇后问题。它的工作原理类似于在决策树中进行深度优先搜索。在尝试放置皇后的过程中,如果发现当前位置无法放置,会回溯到前一步,尝试其他...
可自定义皇后数量,采用爬山法求解,已经vs编译通过,可运行
八皇后问题算法求解
数据结构八皇后问题实验报告是一份详尽的项目文档,主要涵盖了八皇后问题的解决方案,该问题是一个经典的计算机科学和算法问题,源自国际象棋。报告的作者花费了两周时间完成,显然投入了大量的精力和思考。 八皇后...
用python语言,通过遗传算法,解决八皇后问题,,遗传算法(Genetic algorithm)属于演化计算( evolutionary computing),是随着人工智能领域发展而来的一种智能算法。正如它的名字所示,遗传算法是受达尔文进化论...