程序的算法和思想(伪代码)
(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);//打印出所有的方法总数
}
}
代码截图
希望大家看到了哪里有错误的请多多指教