算法思想:
每一行循环选取合适的位置进行放置,若成功则递归进行下一行,若该行所有位置皆不满足,则返回至上一行。
代码:
#include <iostream> #include <math.h> #define N 8 using namespace std; void print(); bool check(int n); void solution(int i); int s[N]; // 记录每行的摆放位置 int sum = 0; // 计数 int main() { solution(0); cout << "sum = " << sum; return 0; } void print() // 打印输出 { for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(j == s[i]) cout << "1"; else cout << "0"; } cout << endl; } cout << endl; } void solution(int i) { if(i == N) // 最后一行成功放置 { print(); ++sum; return; } for(int k = 0; k < N; ++k) // 遍历该行能进行放置的位置 { s[i] = k; if(check(i)) solution(i+1); } } bool check(int n) { for(int i = 0; i < n; ++i) { if(s[i] == s[n]) // 列判断 return false; if(abs(s[n] - s[i]) == n - i) // 对角线判断 return false; } return true; }