1. 程式人生 > 其它 >843. n-皇后問題

843. n-皇后問題

題目:

 

 這 道 題 呢 唯 一 一 點 與 其 他 題 目 不 同 之 處 就 是 它 有 有 3 個 v i s 數 組

 以及是一行一行深搜的。

主要思路為:

從第一行 到第n行,一行放一個,這一行 從第一列到第n列遍歷,同時滿足下列條件即可放置皇后

1.這一列 沒放

2.這一位置的對角線 沒放

3.這一位置的反對角線 沒放

程式實現:

深搜的u引數表示行數,dfs中的i表示列數,col[i] 表示i列的狀態1表示已放過了0表示沒放過,dg[u+i]表示u 行 i列的斜線的狀態1表示已放過了0表示沒放過,udg[n-u+i] 表示u行i列的反斜線的狀態1表示已放過了0表示沒放過。

程式:

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n,dg[N],udg[N],col[N];
char g[N][N];
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cout<<g[i][j];
            }
            cout
<<endl; } puts(""); return; } else { for(int i=0;i<n;i++) { if(dg[u+i]==0&&udg[n-u+i]==0&&col[i]==0) { g[u][i]='Q'; dg[u+i]=1; udg[n-u+i]=1; col[i]
=1; dfs(u+1); dg[u+i]=0; udg[n-u+i]=0; col[i]=0; g[u][i]='.'; } } } } int main() { cin>>n; memset(g,'.',sizeof(g)); dfs(0); return 0; }