排列型枚举实现n皇后问题
作者:
goldstine
,
2022-03-31 15:35:07
,
所有人可见
,
阅读 156
通过排列行枚举实现n皇后问题
import java.io.*;
public class Main{
static int N=20;
static char[][] ordered;
static boolean[] col,dg,udg;
static int nn;
public static void main(String[] args)throws IOException{
BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(cin.readLine());
nn=n;
ordered=new char[N][N];
col=new boolean[N];dg=new boolean[N];
udg=new boolean[N];
//初始化ordered
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ordered[i][j]='.';
}
}
dfs(0);
}
public static void dfs(int cur){
if(cur==nn){
for(int i=0;i<nn;i++){
for(int j=0;j<nn;j++){
System.out.print(ordered[i][j]);
}
System.out.println();
}
System.out.println();
return;
}
//对于每一列
for(int i=0;i<nn;i++){
if(!col[i]&&!dg[cur+i]&&!udg[cur-i+nn]){
col[i]=dg[cur+i]=udg[cur-i+nn]=true;
ordered[cur][i]='Q';
dfs(cur+1);
col[i]=dg[cur+i]=udg[cur-i+nn]=false;
ordered[cur][i]='.';
}
}
}
}
对每一个格子进行搜索
import java.io.*;
public class Main{
static int N=20;
static char[][] ordered;
static boolean[] row,col,dg,udg;
static int nn;
public static void main(String[] args)throws IOException{
BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(cin.readLine());
ordered=new char[N][N];
row=new boolean[N];col=new boolean[N];dg=new boolean[N];udg=new boolean[N];
nn=n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ordered[i][j]='.';
}
}
dfs(0,0,0);
}
public static void dfs(int i,int j,int cnt){
if(j==nn){
j=0;i++;//下一行
}
if(i==nn){
if(cnt==nn){
for(int ii=0;ii<nn;ii++){
for(int jj=0;jj<nn;jj++){
System.out.print(ordered[ii][jj]);
}
System.out.println();
}
System.out.println();
}
return;
}
//两个分支
//不妨皇后,直接dfs
dfs(i,j+1,cnt);
//放,是否能放
if(!row[i]&&!col[j]&&!dg[i+j]&&!udg[i-j+nn]){
//放完之后,修改状态
ordered[i][j]='Q';
row[i]=col[j]=dg[i+j]=udg[i-j+nn]=true;
dfs(i,j+1,cnt+1);
ordered[i][j]='.';
row[i]=col[j]=dg[i+j]=udg[i-j+nn]=false;
}
}
}