N皇后问题

来源:互联网 发布:eureka java demo 编辑:程序博客网 时间:2024/04/30 09:08

一、问题描述:
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。

输入:
给定棋盘的大小n (n ≤ 13)
输出:
输出有多少种放置方法。

代码:

package BackTrack;import java.util.Scanner;public class Q {    static int n;     static int count;        public static void main(String[] args) {            // TODO Auto-generated method stub            Scanner scanner=new Scanner(System.in);            n=scanner.nextInt();            int [][]chess=new int[n+1][n+1];            putchess(1,chess);//从第一行开始,也是第一个            System.out.println(count);        }        private static void putchess(int i,int [][]chess) {//第i行,也是第i个            if(i>n)            {                showchess(chess);                return ;            }                for(int j=1;j<=n;j++)//n列                {                     if(check(i, j,chess))                       {                            chess[i][j]=1;                             putchess(i+1,chess);                            chess[i][j]=0; //还原                     }                }        }        private static void showchess(int [][]chess) {            count++;            System.out.println("第"+count+"种");           for(int i=1;i<=n;i++)           {               for(int j=1;j<=n;j++)               {                   if(chess[i][j]==1)                       System.out.print(i+":"+j+" ");//               System.out.print(chess[i][j]+" ");               }//             System.out.println();           }           System.out.println();        }        private static boolean check(int i,int j,int [][]chess) {            for(int ii=1;ii<i;ii++)            {                for(int jj=1;jj<=n;jj++)                {                    if((chess[ii][jj]==1)&&(jj==j||Math.abs(j-jj)==Math.abs(i-ii)))                        return false;                }            }            return true;        }}
0 0
原创粉丝点击