1. 程式人生 > >八皇后問題用棧與回溯法實現

八皇后問題用棧與回溯法實現

程式的演算法和思想(虛擬碼)

(1)建立一個棧stack和一個數組int[8][8]相當於一個8*8的棋盤

(2)把第一行的八個皇后都入棧然後輸出最後一個皇后

(3)while(!stack.isempty)最上面的一個皇后pop出棧,再把皇后這行和下面的行數都清為零

(4) 然後標記皇后為1,如果這是最後一行就輸出這八個標記了的皇后的位置,否則就判斷下一行是否有符合判斷規則judge()方法的皇后,有的話全部入棧,沒有就返回(3)

原始碼

package cn.test;

//定義一個棧

class Stack{

int top=-1;

int stack[];

public

 Stack(int num) {

stack=new int[num];

}

//出棧

int pop() {

return stack[top--];

}

//入棧,

void push(int x) {

stack[++top]=x;

}

//判空

boolean isempty() {

if(top==-1)

return true;

else

return false;

}

//取棧頂元素

//取棧的長度

}

public class Equeen_huisu {

//定義一個棧和8*8的陣列sum做計數用

static int sum=0;

Stack s=new

 Stack(100);

 static int[][] a=new int[8][8];

public void getQueen() {

//把第一行八個位置都放上皇后

for(int i=0;i<8;i++) {

s.push(i);//列

s.push(0);//行

}

//判斷棧不為空的話取出一個皇后

while(!s.isempty()) {

int x=s.pop();

int y=s.pop();

//先把標記前的清零

for(int i=x;i<8;i++) {

for(int j=0;j<8;j++) {

a[i][j]=0;

}

//標記皇后已經取出

a

[x][y]=1;

//判斷是不是最後一個皇后(是不是最後一行)是的話就要記錄並且,sum+1

if(x==7) {

for(int i=0;i<8;i++) {

for(int j=0;j<8;j++) {

if(a[i][j]==1)

System.out.print(a[i][j]=1);

else System.out.print(a[i][j]=0);

}

System.out.println(" ");

}

System.out.println("----------");

sum++;

}else {

x++;

for(int i=0;i<8;i++) {

if(judge(x,i))

{

s.push(i);

    s.push(x);

}

}

}

}

}

//判斷下面行是否可以放下皇后可以的話就全部入棧

public static boolean judge(int row,int col){

for(int i=0;i<8;i++) {//設定這一列都不在上面

if(a[i][col]==1)

return false;

}

for(int i=row,j=col;i>=0&&j>=0;i--,j--) {

if(a[i][j]==1)

return false;

}

for(int i=row,j=col;i>=0&&j<8;i--,j++) {

if(a[i][j]==1)

return false;

}

return true;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Equeen_huisu ab=new Equeen_huisu();

ab.getQueen();

System.out.println("sum:"+sum);//打印出所有的方法總數

}

}

程式碼截圖

希望大家看到了哪裡有錯誤的請多多指教