P1219-八皇后

八皇后

原题:传送门

 

解题思路:

      典型的回溯题,题目需要我们做两件事:统计一共有多少种放法,输出前三种放法(按照字典顺序,正常顺序即可)。

 

核心代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 int a[200], b[200], c[200], d[200];
 6 //a数组表示的是行;
 7 //b数组表示的是列;
 8 //c表示的是左下到右上的对角线;
 9 //d表示的是左上到右下的对角线
10 int N, ans;
11 void print() {
12     for (int i = 1; i <= N; i++) {
13         cout << a[i] << " ";
14     }
15     cout << endl;
16 }
17 
18 
19 void f(int row) {
20     if (row > N) {
21         if (ans <= 2) {
22             print();
23         }
24         ans++;
25         return;
26     }
27     else {
28         for (int col = 1; col <= N; col++) {
29             if ((!b[col]) && (!c[row + col]) && (!d[row - col + N])) {
30                 a[row] = col;//标记i排是第j个
31                 b[col] = 1;  //标记此列 
32                 c[row + col] = 1;
33                 d[row - col + N] = 1;
34                 f(row + 1);//进一步搜索下一个皇后
35                 //(回到上一步)清除标记
36                 b[col] = 0;
37                 c[row + col] = 0;
38                 d[row - col + N] = 0;
39             }
40         }
41     }
42 }
43 
44 int main() {
45     cin >> N;
46     memset(a, 0, N*N);
47     f(1);
48     cout << ans << endl;
49     return 0;
50 }

 

    原文作者:Diligent_Memory
    原文地址: https://www.cnblogs.com/Diligent-Memory/p/10540604.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞