八皇后問題用棧與回溯法實現
程式的演算法和思想(虛擬碼)
(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=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
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
//判斷是不是最後一個皇后(是不是最後一行)是的話就要記錄並且,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);//打印出所有的方法總數
}
}
程式碼截圖
希望大家看到了哪裡有錯誤的請多多指教