八皇后
可以记一下对角线的判定
因为一行只能放一个皇后 所以dfs传入的x(正在放第几个就可以作为传入的当前行)
public class eightQueensv2 {
static int SIZE=8;
static int count=0;
static boolean[][] vis=new boolean[100][100];//把放了皇后的位置标记为true 初始全为false
static boolean check(int x,int y) {
if(vis[x][y])return false;
//看这个位置是否满足条件
for(int i=1;i<=SIZE;i++) {
for(int j=1;j<=SIZE;j++) {
if(vis[x][j])return false;
if(vis[i][y])return false;
if(Math.abs(x-i)==Math.abs(y-j)&&vis[i][j])return false;
}
}
return true;
}
static void dfs(int x) {//当前在第几行
if(x==SIZE+1) {
count++;
return;
}
//看哪一列可以放
for(int j=1;j<=SIZE;j++) {
if(!check(x, j)) {
continue;
}
vis[x][j]=true;
dfs(x+1);
vis[x][j]=false;
}
}
public static void main(String[] args) {
dfs(1);
System.out.println(count);
}
}
黑白皇后
了解了上面的黑皇后之后可以尝试写一下黑白皇后 :
【问题描述】
给定一个n×n的棋盘,现在要向棋盘中放入n个黑皇后和n个白皇后,使
任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇
后都不在同一行、同一列或同一条对角线上:
问总共有多少种放法?
public class blackWhiteQueens {
//先放黑皇后再放白皇后
static int SIZE=8;
static int[][] f=new int[100][100];//0表示什么都没放 1表示放了黑皇后 2表示放了白皇后
static int count=0;
static boolean check(int x,int y,int queen) {
if(f[x][y]!=0)return false;//如果已经被放了 不满足条件
for(int i=1;i<=SIZE;i++) {
for(int j=1;j<=SIZE;j++) {
if(f[x][j]==queen)return false;
if(f[i][y]==queen)return false;
if(f[i][j]==queen&&Math.abs(x-i)==Math.abs(y-j))return false;
}
}
return true;
}
static void dfs(int x,int queen) {//在放第i个皇后 也就是i行
if(x==SIZE+1) {
if(queen==1) {
dfs(1, 2);
}else {
count++;
return;
}
}
for(int j=1;j<=SIZE;j++) {
if(!check(x,j,queen))continue;
f[x][j]=queen;
dfs(x+1, queen);
f[x][j]=0;
}
}
public static void main(String[] args) {
dfs(1, 1);
System.out.println(count);
}
}
一次dfs在一行同时放黑皇后和白皇后会比较复杂
我们先放完黑皇后再去放白皇后