第一题:N皇后问题(八皇后为例):
代码如下:
<pre name="code" class="java">package queen;
class Queen
{
static final int n = 8; // 皇后的数量
int[][] x = new int[n][n];// 分配8X8的数组,充当棋盘,存放皇后
int sum = 0;// 记录皇后的放置方法的总数
int[] y = new int[n];// 存放每行的皇后位置即第column行的皇后放置位置是y[column]
public void putQueen(int Rows)
{
int row = Rows;
for (int column = 0; column < n; column++)
{
if (x[row][column] == 0)
{
for (int rowi = row + 1; rowi < n; rowi++)
{
x[rowi][column]++;
if (column - rowi + row >= 0)
{
x[rowi][column - rowi + row]++;
}
if (column + rowi - row < n)
{
x[rowi][column + rowi - row]++;
}
}
y[row] = column;
if (row == n - 1)
{
printQueen(++sum);
}
else
{
putQueen(row + 1);
}
for (int rows = row + 1; rows < n; rows++)// 回溯,在此行的皇后不放此列column // ,恢复该位置的正下面/斜下面的count
{
x[rows][column]--;
if (column - rows + row >= 0)
{
x[rows][column - rows + row]--;
}
if (column + rows - row < n)
{
x[rows][column + rows - row]--;
}
}
}
}
if (row == 0)
{
System.out.println(n + "皇后问题共有" + sum + "个解.");
}
}
public void printQueen(int size)// 打印皇后布局
{
System.out.println(n + "皇后的第" + size + "个解是:");
System.out.println();
for (int row = 0; row < n; row++)
{
for (int column = 0; column < n; column++)
{
System.out.print(y[row] == column ? " Q " : " X ");
}
System.out.println();
}
System.out.println();
}
public static void main(String[] args)
{
Queen Q = new Queen();
Q.putQueen(0);
}
}