这里以最常见的8皇后为例
/**
* TODO 八皇后
*
* @author yaomingfeng
* @version C10 2017年12月18日
* @since SDP V300R003C10
*/
public class Queen
{
// 方法的总数
static int count = 1;
// 棋盘,0表示没有放皇后,1表示放了皇后
static int[][] chessboard = new int[8][8];
public static void main(String[] args)
{
play(0);
}
public static void play(int row)
{
// 遍历当前行的所有单元格
for (int i = 0; i < 8; i++)
{
if (check(row, i))
{
chessboard[row][i] = 1;// 当前位置可以放皇后
if (row == 7)// 如果是最后一行,表示完成8皇后
{
show();
// 当最后一个皇后摆好,去掉皇后继续摆放
}
else
{
play(row + 1);// 向下一行设置
// 当调用自己结束时,去掉当前设置的皇后
}
chessboard[row][i] = 0;// 去皇后
}
}
}
// 判断此位置是否可以放皇后
public static boolean check(int row, int col)
{
// 判断左上方
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
{
if (chessboard[i][j] == 1)
return false;
}
// 判断上方
for (int i = row - 1; i >= 0; i--)
{
if (chessboard[i][col] == 1)
return false;
}
// 判断右上方
for (int i = row - 1, j = col + 1; i >= 0 && j < 8; i--, j++)
{
if (chessboard[i][j] == 1)
return false;
}
return true;
}
// 显示棋盘
public static void show()
{
System.out.println("第" + count + "种摆法");
count++;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
System.out.print(chessboard[i][j] + " ");
}
System.out.println();
}
}
}
欢迎留言讨论