续 dfs 八皇后问题(9/24)

发布时间 2023-09-24 20:16:05作者: 敲代码的6

第一种 类似于上一个题目得变形

#include<iostream>
using namespace std;
const int N = 20; int n;
char p[N][N];
bool col[N], dg[N*2], udg[N*2];//注意范围的设置
void dfs(int u) {
    if (u == n) {
        for (int i = 0; i < n; i++) {
            cout << p[i] << endl;//注意这步输出
        }
        cout << endl;
        return;
    }
//求斜对角线时候用公式y=x+b来算,反对角是怕有负数,整体上移一个图形,但是位置不变

    for (int i = 0; i < n; i++) {
        if (!col[i] && !dg[u+i] && !udg[n+u-i]) {
            p[u][i] = 'Q';
            col[i] = dg[u + i] = udg[n + u - i] = true;
            dfs(u + 1);
            col[i] = dg[u + i] = udg[n + u - i] = false;
            p[u][i] = '.';
        }
    }

}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            p[i][j] = '.';
        }
    }
    dfs(0);
    return 0;
}

第二种是一个个枚举直到成功就输出

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 20; int n;
char p[N][N];
bool col[N],row[N], dg[N*2], udg[N*2];
void dfs(int x,int y,int s) {
   if(s>n) return;//皇后多了的情况,直接跳出
   if(y==n){x++;y=0;}//到结尾处换行
   if(x==n){
       if(s==n){
           for(int i=0;i<n;i++){         
               cout<<p[i]<<endl;}
           cout<<endl;
       }
        return;//注意return摆放得位置,放在for循环里就会死循环
   }
   
   p[x][y]='.';
   dfs(x,y+1,s);//类型于for循环中累加的操作,不停止继续,并判断
   if(!col[y]&&!row[x]&&!dg[y+x]&&!udg[n+y-x])
   {
       p[x][y]='Q';
       col[y]=row[x]=dg[y+x]=udg[n+y-x]=true;
       dfs(x,y+1,s+1);//继续递归循环
       col[y]=row[x]=dg[y+x]=udg[n+y-x]=false;
       p[x][y]='.';
   }

}
int main()
{
    cin >> n;
    dfs(0,0,0);
    return 0;
}