一、问题描述:
在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;
}
}