P1219八皇后 Checker Challenge

一.题目描述:

 

 

 

 二.解题思路:

刚开始用的打印图形的解法做T了一个点,后面意识到不需要打印图形那么麻烦的操作,直接用一维数组下标代表行号,值代表列。每次选择一列的时候,要判断是否符合。

条件有四个

1.和前面已放置好的皇后不处于同一行 及f!=i,这个条件不需要手动判断,因为你递归的时候已经是往下选择皇后的

2.不在同一列上,及a[i] ~ a[f-1] != a[f]

3.不在次对角线上,通过分析下标可知,只要两点满足x + y1 不等于 x1 + y,及i + a[f] != f + a[i]即可

4.不在主对角线上,通过分析下标可知,只要两点满足x + y 不等于 x1 + y1,   及i + a[i] != f + a[f]即可

三.代码实现:

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int cnt;
 4 int n;
 5 int a[20];//下标代表行,值代表列
 6 bool check(int val,int f)
 7 {
 8     for(int i = 1;i < f;i++){
 9         if(a[i] == val) return false;
10         if(i + a[i] == val + f) return false;
11         if(i + val == f + a[i]) return false;
12     }
13     return true;
14 }
15 void dfs(int f)
16 {
17     if(f == n + 1){
18         cnt++;
19         if(cnt <= 3){
20             for(int i = 1;i <= n;i++)
21                 cout << a[i] << ' ';
22             cout << endl;
23         }
24     }
25     for(int i = 1;i <= n;i++){
26         if(check(i,f)){
27             a[f] = i;
28             dfs(f+1);
29         }
30     }
31 }
32 int main()
33 {
34     cin >> n;
35     dfs(1);
36     cout << cnt << endl;
37     return 0;
38 }

 

posted @ 2022-01-09 22:02  scannerkk  阅读(47)  评论(0)    收藏  举报