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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}