1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 25209 通过数: 9181
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
…以下省略提
思路分析:该题继续套用深搜回溯模板
利用递归遍历回溯每一种可能性结果
递归结束的条件为八行每一行都安排完一种情况需要return;
在递归过程中for循环是遍历的每一列的方案数,而递归dfs的参数是对每一行的情况的遍历。在for循环中,判断if的条件为(检查每一列,每一右斜,左斜列都不存在棋子则判断为满足条件),进入if语句中将该位置放下棋子置为1,并向下一行dfs(r+1)递归。回溯只需要将该棋子收回也就是数组元素置为0。
在判断方案满足条件时不需要特意检测每一行,因为递归参数r的限制自动++,不会出现行上重复的情况,检查每一列,列保持不变。
检查每一左倾斜列(j - z == r - i && a[j][z] == 1)
右倾斜列 (j + z == r + i && a[j][z] == 1)
import java.util.*;
public class Main {
static int num = 0;
static int a[][] = new int[10][10];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
dfs(1);
}
static void print() {
System.out.println("No." + num);
for (int j = 1; j <= 8; j++) {
for (int z = 1; z <= 8