蓝桥--2n皇后问题(递归)--搬运+整理+注释

N皇后问题:

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 int N;
 6 int queenPos[100];//用来存放算好的皇后位置。最左上角是(0,0)
 7 
 8 void NQueen(int k);
 9 
10 int main()
11 {
12     cin >> N;
13     NQueen(0); //从第0行开始摆皇后
14     return 0;
15 }
16 void NQueen(int k) //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
17 {
18     int i;
19     if (k == N) // N 个皇后已经摆好
20     {
21         for (i = 0; i < N; i++)
22             cout << queenPos[i] + 1 << " ";
23         cout << endl;
24         return;
25     }
26     for (i = 0; i < N; i++)//逐一尝试第k个皇后所在的列i. 
27     {
28         int j;
29         for (j = 0; j < k; j++)
30         {
31             //和已经摆好的 k个皇后的位置比较,看是否冲突
32             //queenPos[j] == i表示第j个皇后所在的列queenPos[j]与第k个皇后所在的列i相等
33             //abs(queenPos[j] - i) == abs(k-j)表示第k个皇后和第j个皇后在同一个斜线(行之差与列之差绝对值相等) 
34             if (queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))
35             {
36                 break; //冲突,则试下一个位置
37             }
38         }
39         if (j == k)  //当前选的位置 i 不冲突
40         {
41             queenPos[k] = i; //将第k个皇后摆放在第i列 
42             NQueen(k + 1);
43         }
44     } //for( i = 0;i < N;i ++ )
45 }

2N皇后:

#include<iostream>
#include<math.h>
using namespace std;
#define N   100
int wq[N];           //whitequeen,黑皇后位置
int bq[N];           //blackqueen,白皇后位置
int cb[N][N];        //chessboard,棋盘
int num;             //皇后数目
int count = 0;       //不同放置情况计数

int bqueen(int pos)  //黑色皇后放置
{
    int i;
    for (i = 0; i < pos - 1; i++)
    {
        int judge = bq[i] - bq[pos - 1];
        if (0 == judge || abs(judge) == abs(pos - 1 - i))
            return 0;
    }
    if (pos == num)
    {
        ::count++;
        return 0;
    }

    for (int i = 0; i < num; i++)
    {
        if (i != wq[pos] && cb[pos][i])
        {
            bq[pos] = i;
            bqueen(pos + 1);
        }
    }
}
int wqueen(int pos) //白色皇后放置
{
    int i;
    for (i = 0; i < pos - 1; i++)//处理之前置入的皇后,判断是否冲突,冲突就返回,同时貌似放在这边还能使递归能返回,很巧妙,博主我只是搬运
    {
        int judge = wq[i] - wq[pos - 1];
        if (0 == judge || abs(judge) == abs(pos - 1 - i ))
            return 0;
    }

    //当前的pos意为已经有pos个放好了,这次函数在处理pos+1的调用
    if (pos == num)//放满了才会调用
    {
        bqueen(0);
        return 0;
    }

    for (int i = 0; i < num; i++)
    {
        if (cb[pos][i])//该位置是否能放,能放的话,每一个都试一下,如果不行,会返回0----当前不判断的是否能放,由N+1
                       //来查看N次是否能放,不能放就会返回0
        {
            wq[pos] = i;
            wqueen(pos + 1);
        }

    }
}

int main()
{
    cin >> num;
    for (int i = 0; i < num; i++)
        for (int j = 0; j < num; j++)
            cin >> cb[i][j];
    wqueen(0);//先白后黑
    cout << ::count;
    return 0;
}

 

上一篇:#Leetcode# 997. Find the Town Judge


下一篇:Disgruntled Judge UVA - 12169