思路:用的dfs思想,第一种是全排列思路,和数字排列同样的步骤。要注意对对角线的判断。下面画了个图简单示意一下。


0324重写正确啦!!!独立完成了!!!可喜可贺!!
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n;
const int N = 100;
char mp[N][N];
bool col[N],dg[N],udg[N];
void dfs(int u){
//每行的深搜,一定是没到达过的,不用另设状态数组
if(u == n){
//已经遍历到最后一行,有一组解,输出
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%c",mp[i][j]);
}
printf("\n");
}
printf("\n");
return ;
}
//搜索每一列
for(int i=0;i<n;i++){
if(!col[i] && !dg[u+i] && !udg[n+u-i]){
col[i] = dg[u+i] = udg[n+u-i] = true;
mp[u][i] = 'Q';
dfs(u+1);
mp[u][i] = '.';
col[i] = dg[u+i] = udg[n+u-i] = false;
}
}
return ;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mp[i][j] = '.';
}
}
//从第一行开始深搜
dfs(0);
return 0;
}
0322重写代码:
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 100;
char mp[N][N];
bool col[N],dg[N],udg[N];//列,左右对角线
int n;
void dfs(int u){
//每行依次向下寻找
if(u == n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<mp[i][j];!!!!!!!不要有多余空格
}
cout<<endl;
}
cout<<endl;
return;
}
//循环列
for(int c=0;c<n;c++){
if(!col[c] && !dg[u-c+n] && !udg[u+c] && mp[u][c] == '.'){!!!!u-c+n与c-u+n关系不大,都可以
col[c] = true;
dg[u-c+n] = true;
udg[u+c] = true;
mp[u][c] = 'Q';
dfs(u+1);//下一列
col[c] = false;
dg[u-c+n] = false;
udg[u+c] = false;
mp[u][c] = '.';
}
}
return ;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mp[i][j] = '.';
}
}
dfs(0);//第1行开始搜索
return 0;
}
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
bool c[10],dg[10],udg[10];//状态数组不用再看每一行了,因为从上向下遍历,一定没用过行,只看列和左右对角线的状态就可以了
char mp[10][10];
void dfs(int u){//只看到没到达最后一行
if(u == n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<mp[i][j];
}
cout<<endl;
}
cout<<endl;
return;
}
//看行,列,左对角线,右对角线
//枚举的 u 是行,我们要看皇后放在哪一列上
for(int i=0;i<n;i++){
if(!c[i] && !dg[u + i] && !udg[i - u + n]){
c[i] = dg[u + i] = udg[i - u + n] = true;
mp[u][i] = 'Q';
dfs(u+1);
c[i] = dg[u + i] = udg[i - u + n] = false;
mp[u][i] = '.';
}
}
return ;
}
int main()
{
scanf("%d",&n);
//初始化地图
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mp[i][j] = '.';
}
}
dfs(0);
return 0;
}