皇后能横向,纵向和斜向移动,在这三条线上的其他棋子都可以被吃掉。那么,将八位皇后放在一张8x8的棋盘上,使得每位皇后都无法吃掉别的皇后,求一共有多少种摆法
递归回溯:
public class EightQueens {
public static int[][]array=new int[8][8]; //坐标数组,0~7 x 0~7
public static void main(String[]args)
{
placeQueen(0);
}
public static void placeQueen(int row)
{
if(row>7)
{
print();
return; //终止函数运行,返回上一层
}
for(int column=0;column<8;column++)
{
if(check(row,column))
{
array[row][column]=1;
placeQueen(row+1); //若当前坐标(row,column)可放下,则进入放下一行的,那么当第row=8时,说明0~7都成功放下
}
array[row][column]=0; //清除没有成功放完7行但标记为1的坐标
}
}
public static void print()
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(array[i][j]==1)
System.out.print(j+1+" ");
System.out.print("\n");
}
public static boolean check(int x,int y)
{
for(int i=x,j=y;i<8&&j<8;i++,j++)//y=kx+b,k=1的这条对角线
{
if(array[i][j]==1)
return false;
}
for(int i=x,j=y;i>=0&&j>=0;i--,j--)//y=kx+b,k=1的这条对角线
{
if(array[i][j]==1)
return false;
}
for(int i=x,j=y;i<8&&j>=0;i++,j--)//y=kx+b,k=-1的这条对角线
{
if(i>=0 && j>=0)
if(array[i][j]==1)
return false;
}
for(int i=x,j=y;i>=0&&j<8;i--,j++)//y=kx+b,k=-1的这条对角线
{
if(array[i][j]==1)
return false;
}
for(int i=0;i<8;i++)
{
if(array[i][y]==1) //竖线,纵向
return false;
}
return true;
}
}