zoukankan      html  css  js  c++  java
  • java实现八皇后问题(递归和循环两种方式)

    循环方式:

    package EightQueens;
     
    public class EightQueensNotRecursive {
    private static final boolean AVAILABLE = true;
    private int squares = 8, norm = squares - 1;
    private int positionInRow[] = new int[squares];
    private int p=-1;
    private boolean[] rows = new boolean[squares];
    private boolean[] column = new boolean[squares];
    private boolean[] leftDiagonal = new boolean[2 * squares - 1];
    private boolean[] rightDiagonal = new boolean[2 * squares - 1];
    private static int howMany = 0;
     
    public EightQueensNotRecursive() {
    // To complete the initialization work for the
    // column,leftDiagonal,rigthDiagonal.
    for (int i = 0; i < squares; i++) {
    rows[i] = AVAILABLE;
    column[i] = AVAILABLE;
    positionInRow[i] = -1;
    }
    for (int i = 0; i < 2 * squares - 1; i++) {
    leftDiagonal[i] = AVAILABLE;
    rightDiagonal[i] = AVAILABLE;
    }
     
    }
     
    public void printResults(int[] columns) {
    int row, col;
    System.out.println("八皇后问题的第 " + howMany + " 种解法");
    System.out.print("八皇后问题的结果为:");
    for (int e : columns) {
    System.out.print(e);
    }
    System.out.println(" 具体的图示如下图所示:");
    for (row = 0; row < squares; row++) {
    for (col = 0; col < squares; col++) {
    if (col == positionInRow[row]) {
    System.out.print("@");
    } else {
    System.out.print("*");
    }
    }
    System.out.println();
    }
    System.out.println();
    }
     
    public void putQueen() 
    {
    int row=0, col;
    while (true) 
    {
    for (col = p + 1; col < squares; col++)
    {
    if(rows[row]==AVAILABLE&&column[col]==AVAILABLE&&leftDiagonal[row+col]==AVAILABLE&&rightDiagonal[row-col+norm]==AVAILABLE)
    {
    break;
    }
    }
    //在当前的行里面找到了可以放置皇后的位置
    if(col<squares)
    {
    rows[row]=!AVAILABLE;
    column[col]=!AVAILABLE;
    leftDiagonal[row+col]=!AVAILABLE;
    rightDiagonal[row-col+norm]=!AVAILABLE;
    positionInRow[row]=col;
    p=col;
    }else//如果当前行没办反放置皇后了,那么回溯
    {
    if(row>0)//到前一行
    {
    row--;
    p=positionInRow[row];
    rows[row]=AVAILABLE;
    column[p]=AVAILABLE;
    leftDiagonal[row+p]=AVAILABLE;
    rightDiagonal[row-p+norm]=AVAILABLE;
    positionInRow[row]=-1;
    continue;
    }else
    {
    break;
    }
    }
    if(row==squares-1)
    {
    howMany+=1;
    printResults(positionInRow);
    p=positionInRow[row];
    rows[row]=AVAILABLE;
    column[p]=AVAILABLE;
    leftDiagonal[row+p]=AVAILABLE;
    rightDiagonal[row-p+norm]=AVAILABLE;
    positionInRow[row]=-1;
    continue;
    }
    else
    {
    row++;
    p=-1;
    continue;
    }
    }
    }
    public static void main(String args[])
    {
    EightQueensNotRecursive eightQueens=new EightQueensNotRecursive();
    eightQueens.putQueen();
    System.out.println("皇后问题一共有"+howMany+"种解法");
    }
     
    }
     
    递归方式:
    package EightQueens;
     
    public class EightQueensRecursive {
    private static final boolean AVAILABLE=true;
    private int squares=8,norm=squares-1;
    private int positionInRow[]=new int[squares];
    private boolean[] column=new boolean[squares];
    private boolean[] leftDiagonal=new boolean[2*squares-1];
    private boolean[] rightDiagonal=new boolean[2*squares-1];
    private static int howMany=0;
    public EightQueensRecursive(){
    //To complete the initialization work for the column,leftDiagonal,rigthDiagonal.
    for(int i=0;i<squares;i++){
    column[i]=AVAILABLE;
    positionInRow[i]=-1;
    }
    for(int i=0;i<2*squares-1;i++){
    leftDiagonal[i]=AVAILABLE;
    rightDiagonal[i]=AVAILABLE;
    }
    }
    public void printResults(int[] columns){
    int row,col;
    System.out.println("八皇后问题的第 "+howMany+" 种解法");
    System.out.print("八皇后问题的结果为:");
    for(int e:columns){
    System.out.print(e);
    }
    System.out.println(" 具体的图示如下图所示:");
    for(row=0;row<squares;row++){
    for(col=0;col<squares;col++){
    if(col==positionInRow[row]){
    System.out.print("@");
    }else{
    System.out.print("*");
    }
    }
    System.out.println();
    }
    System.out.println();
    }
    public void putQueen(int row){
    //如果前面已经得到了一个可行解
    for(int i=0;i<squares;i++)
    {
    if(row>squares-1) break;
    if(column[i]==AVAILABLE&&leftDiagonal[row+i]==AVAILABLE&&rightDiagonal[row-i+norm]==AVAILABLE)
    {
    positionInRow[row]=i;
    column[i]=!AVAILABLE;
    leftDiagonal[row+i]=!AVAILABLE;
    rightDiagonal[row-i+norm]=!AVAILABLE;
    if(row<squares-1){
    putQueen(row+1);
    }else
    {
    howMany+=1;
    printResults(positionInRow);
    }
    column[i]=AVAILABLE;
    leftDiagonal[row+i]=AVAILABLE;
    rightDiagonal[row-i+norm]=AVAILABLE;
    }
    }
    }
    public static void main(String args[]){
    EightQueensRecursive eightQueens=new EightQueensRecursive();
    eightQueens.putQueen(0);
    System.out.println("皇后问题一共找到了 "+howMany+"组解。");
    }
    }
  • 相关阅读:
    面试中要注意的 3 个 JavaScript 问题
    angularJS遇到的坑
    为什么你的前端工作经验不值钱?
    ceph pg常见的几种状态
    k8s网络之flannel
    k8s流量访问之service
    lvs+keepalived高可用
    iptables【学习笔记】
    Linux和OpenStack中的网络知识【学习笔记】
    服务器BIOS设置
  • 原文地址:https://www.cnblogs.com/jxldjsn/p/5080620.html
Copyright © 2011-2022 走看看