溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題算法示例

發(fā)布時(shí)間:2020-09-23 06:28:38 來源:腳本之家 閱讀:129 作者:qq7342272 欄目:編程語言

本文實(shí)例講述了Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題。分享給大家供大家參考,具體如下:

運(yùn)行效果圖如下:

Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題算法示例

棋盤接口

/**
 * 棋盤接口
 * @author Administrator
 *
 */
public interface Piece {
  abstract boolean isRow(int line);
  abstract boolean isCol(int line,int col);
}

棋盤類:

/**
 * 棋盤
 * @author Administrator
 *
 */
public class Chessboard implements Piece {
  static boolean[][] che = null;
  public int row;
  public int col;
  private int num=0;
  public Chessboard (int row,int col){
    this.che=new boolean[row][col];
    this.row=row;
    this.col=col;
  }
  //當(dāng)前行是否能放棋子
  public boolean isRow(int line){
    for (int i = 0; i < this.row; i++) {
      if (che[i][line] == true) {
        return false;
      }
    }
    return true;
  }
  //棋子邊角
  public boolean isCol(int line,int col){
    int i = 0, j = 0;
    for (i = line, j = col; i < this.row && j < this.row; i++, j++) { //右下角;
      if (che[i][j] == true) {
        return false;
      }
    }
    for (i = line, j = col; i >= 0 && j >= 0; i--, j--) { //左上角;
      if (che[i][j] == true) {
        return false;
      }
    }
    for (i = line, j = col; i >= 0 && j < this.row; i--, j++) { // 右上角;
      if (che[i][j] == true) {
        return false;
      }
    }
    for (i = line, j = col; i < this.row && j >= 0; i++, j--) { //左下角;
      if (che[i][j] == true) {
        return false;
      }
    }
    return true;
  }
  public void pr() {//打印滿足條件的擺放方法
    num++;
    System.out.println("第" + num + "種方式");
    System.out.print("-------------start-------------");
    for (int i = 0; i < this.row; i++) {
      System.out.println();
      for (int j = 0; j < this.row; j++) {
        if (che[i][j] == true) {
          System.out.print("Q ");
        } else {
          System.out.print(". ");
        }
      }
    }
    System.out.println();
    System.out.println("-------------end-------------");
  }
}

皇后類

/**
 * 皇后
 * @author Administrator
 *
 */
public class empress {
  private Chessboard che=null;
  private int count=0;
  private int row=0;
  public empress(int row,int col){
    this.che=new Chessboard(row,col);
    this.row=row;
  }
  //主要的遞歸實(shí)現(xiàn)方法
  public void mk(int line) {
    if (line > this.row-1)
      return;//超過行則退出
    for (int i = 0; i < this.row; i++) {
      if (che.isRow(i) && che.isCol(line,i)) { //ture 為可以擺皇后;
        che.che[line][i] = true; //
        count++; //
        if (count > this.row-1) {
          che.pr();//擺放皇后8個(gè)則打印結(jié)果
        }
        mk(line + 1);//遞歸
        che.che[line][i] = false; //回溯
        count--;
        continue;
      }
    }
    return;
  }
}

啟動(dòng):

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class start {
  public static void main(String[] args) {
    String inputrow = JOptionPane.showInputDialog("輸入行:");
    int row = Integer.parseInt(inputrow);
    String inputcol = JOptionPane.showInputDialog("輸入列:");
    int col = Integer.parseInt(inputcol);
    empress emp=new empress(row,col);
    emp.mk(0);
  }
}

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《java日期與時(shí)間操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI