8皇后算法

Java实现8皇后算法

 1 package com.java;
 2
 3 /**
 4  * Created by dell on 2018-08-26.
 5  */
 6 public class nQueen {
 7
 8     /**
 9      八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
10      该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
11      在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
12      问有多少种摆法。
13
14      思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列。
15      直到所有皇后都放完,或者放哪都不行。
16
17      第一个皇后先放第一行第一列,然后第二个皇后放在第二行第一列、然后判断是否OK,然后第二列、第三列、依次把所有列都放完,
18      找到一个合适,继续第三个皇后,还是第一列、第二列……
19      直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。
20      然后回头继续第一个皇后放第二列,后面继续循环……
21      */
22
23     //一共有多少个皇后(此时设置为8皇后在8X8棋盘,可以修改此值来设置N皇后问题)
24     static int max = 8;
25
26     //该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列
27     static int[] result = new int[max];
28
29     static int count=0;
30
31     public static void main(String[] args) {
32         //N皇后
33         check(0);
34         System.out.println("一共找到:" + count +"种解法");
35     }
36
37     /**
38      * n代表当前是第几行的皇后
39      * @param n
40      * 皇后n在array[n]列
41      */
42     private static void check(int n) {
43         /*终止条件是最后一个皇后已经摆完,由于每摆一步都会校验是否有冲突,所以只要最后一个摆完,说明已经得到了一个正确解*/
44         //n表示行号
45         if (n==max){
46             //System.out.println(Arrays.toString(result));
47             count++;
48             System.out.println("找到一种解法如下(1-8代表8个皇后的摆放位置):");
49             int[][] A = new int[max][max];
50             for (int i = 0; i < result.length; i++) {
51                 A[i][result[i]]=i+1;
52             }
53             for (int i = 0; i < A.length; i++) {
54                 for (int j = 0; j < A[i].length; j++) {
55                     System.out.print(A[i][j]+"\t");
56                 }
57                 System.out.println();
58             }
59             return;
60         }
61         /*从每行的列开始放值,然后判断是否和本行本列本斜线有冲突,如果OK,就进入下一行的逻辑*/
62         //i表示列的下标号
63         for (int i=0;i<max;i++){
64             result[n]=i;
65             if (judge(n)){
66                 check(n+1);
67             }
68         }
69     }
70     //判断是否和本行本列本斜线有冲突。有冲突返回false;无冲突返回true
71     public static boolean judge(int n){
72         for (int i=0;i<n;i++) {
73             if (result[i]==result[n] || Math.abs(n-i)==Math.abs(result[n]-result[i])){
74                 return false;
75             }
76         }
77         return true;
78     }
79
80 }

原文地址:https://www.cnblogs.com/weijuanran/p/EightQueen.html

时间: 2024-11-09 09:27:05

8皇后算法的相关文章

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

Jeff Somers&#39;s N Queens Solutions 最快的n皇后算法

1 /* Jeff Somers 2 * 3 * Copyright (c) 2002 4 * 5 * [email protected] 6 * or 7 * [email protected] 8 * 9 * April, 2002 10 * 11 * Program: nq 12 * 13 * Program to find number of solutions to the N queens problem. 14 * This program assumes a twos compl

Python学习二(生成器和八皇后算法)

看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 def table(m, lst): '''绘制m列的棋盘,每行有个皇后旗子''' head = '┌' + '─┬' * (m-1) + '─┐' row = lambda x: '│' + ' │' * x + '╳│' + ' │' * (m - x - 1) trow = '├' + '─

八皇后算法的另一种实现(c#版本)

八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种计算机语言可以解决此问题. 图示: 我的解决方案: 网上有大量的方法,大部分抽象难以理解,并且有知乎大神整理出了10

回溯法实例―n皇后算法 (java实现)

问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或 同一列或同一斜线上. Math.abs(k-j)==Math.abs(x[j]-x[k])||(x[j]==x[k])//满足此条,说明不符合条件,即处在同一行或同一列或同一斜线 import java.util.Scanner; public class BackTrack { public

八皇后算法

#include<iostream> using namespace std; #define MAX 8 int queen[MAX]={0}; int sum = 0; void show() { printf("("); for(int i =0;i<MAX;i++) { printf(" %d",queen[i]); } printf(")\n"); sum++; } int place(int n) { for(int

2018.4.24 java实现8皇后算法

import java.util.Scanner; public class Nqueens { private boolean verify(int[] arr,int i) { // TODO Auto-generated method stub for (int j = 1; j != i; j++) { if(j == i) { continue; } if(arr[i]==arr[j]||Math.abs(i-j)==Math.abs(arr[i]-arr[j])) { return

回溯算法之8皇后问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// 8皇后算法 /// <ather> /// <lihonglin> /// </ather> /// </summary> class EightQueen { private const in

算法回顾--N皇后问题简单回顾

前言 最近学习的过程中,不知道哪门子的思维发散,突然又遇见皇后问题了,于是乎老调重弹,心里琢磨,虽然思路大家都容易懂,哪怕是最简单的野蛮回溯法,说着简单,但是如果非得编码实现?我可以一次性写出来OK的代码吗?我对此表示疑问,于是乎动手写代码,发现写此类算法问题,最重要的是边界条件的判断.这里说明一下,这篇纯属练手,不考虑算法效率,只是为了实现,为了练习最暴力野蛮的回溯,说白了,就是怎样简单粗暴的玩弄for和while这些个玩意! 实现 本人比较懒,所以懒得搞二维数组来存储皇后坐标,其实用二维数组