AcWing 843. n-皇后问题
原题链接
中等
作者:
Drifter
,
2020-08-08 16:21:54
,
所有人可见
,
阅读 389
算法1
C++ 代码
#include<stdio.h>
#define N 10
int n;
char path[N][N];
bool col[N],dg[N],udg[N];
void dfs(int row)
{
if(row==n)
{
for(int i=0;i<n;i++) puts(path[i]);
puts("");
return;
}
for(int i=0;i<n;i++)
{
if(!col[i]&&!dg[row+i]&&!udg[row-i+n])
{
path[row][i]='Q';
col[i]=dg[row+i]=udg[row-i+n]=true;
dfs(row+1);
path[row][i]='.';
col[i]=dg[row+i]=udg[row-i+n]=false;
}
}
}//dfs
int main(void)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
path[i][j]='.';
dfs(0);
return 0;
}
算法2
C++ 代码
#include<stdio.h>
#define N 10
int n;
char path[N][N];
bool row[N],col[N],dg[N],udg[N];
void dfs(int x,int y,int num)
{
if(y==n) x++,y=0;
if(x==n)
{
if(num==n)
{
for(int i=0;i<n;i++) puts(path[i]);
puts("");
}
return;
}
//不放皇后
dfs(x,y+1,num);
//放皇后
if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[n+x-y])
{
row[x]=col[y]=dg[x+y]=udg[n+x-y]=true;
path[x][y]='Q';
dfs(x,y+1,num+1);
row[x]=col[y]=dg[x+y]=udg[n+x-y]=false;
path[x][y]='.';
}
}
int main(void)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
path[i][j]='.';
dfs(0,0,0);
return 0;
}