八皇后问题(Java)——深度优先搜索

问题描述

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

输入:无输入。

输出:按给定顺序和格式输出所有八皇后问题的解。

解决思路

·定义数组loc[8],如loc[4]=7表示棋盘的第5列的皇后在第7行

·voidDFS(depth){

·If(depth==8)得到一组解

·else 尝试往loc[depth]赋值(写一个函数检查放入是否冲突)

·如果可以摆,则DFS(depth+1)

}

核心代码

import java.util.Scanner;

 

public class Main{

       staticint count=0;//解的个数

       publicstatic void main(String[] args) {

       int[]queen=new int[9];//记录每一列皇后所在的位置0-8

       dfs(1,queen);

}

public static void dfs(int row,int[]queen)//从第row列开始深度搜索

       {

              if(row==9)//表示8个皇后已经摆放完了

              {

                     count++;

                     System.out.println("No."+count);

                     print(queen);

              }

              else

                     for(inti=1;i<=8;i++)

                     {

                            queen[row]=i;//在这一列的第i行摆放一个皇后

                            if(judge(queen,row))//判断在此列摆放皇后是否与前面产生冲突

                            dfs(row+1,queen);//没有冲突则开始下一列8个位置的摆放尝试

                     }

       }

//判断在第i列的皇后与前面已经放置好的皇后是否会有冲突

public static boolean judge(int[] a,int i)

{

       for(intj=1;j

       {

              if(a[j]==a[i])//在同一行

                     returnfalse;

              if(Math.abs(a[i]-a[j])==i-j)//在同一对角线上

                     returnfalse;

       }

              returntrue;//包括了在第一列一定成立的情况

}

//将解以表格的形式打印出来

public static void print(int queen[])

{

       int[][]a=new int [9][9];

       for(inti=1;i<=8;i++)//行

       {

                     a[queen[i]][i]=1;

       }

       for(intm=1;m<=8;m++)

       {

              for(intn=1;n<=8;n++)

              {

                     System.out.print(a[m][n]+"");

              }

              System.out.println();

       }

}

}

运行结果

按给定顺序和格式输出所有八皇后问题的解。

样例输出:No. 1

1 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0

0 0 1 0 0 0 0 0

       …以下省略




你可能感兴趣的:(八皇后问题(Java)——深度优先搜索)