涵先森的創作園地
阿新 • • 發佈:2018-12-17
本演算法採用遞歸回溯的思想:
#include <iostream> #include <cmath> using namespace std; const int N = 8; long count = 0; // 計數 void print(int * mapping) { for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(j == mapping[i]) cout << "1"; else cout << "0"; } cout << endl; } cout << endl; } // 判斷該位置是否可以放置 bool isokay(int * mapping, int i, int j) { for(int k = 0; k < i; ++k) // 依次遍歷之前已經擺好的位置,是否與將要擺放的位置有衝突 { if(abs(j - mapping[k]) == i - k || j == mapping[k]) return false; } return true; } void solution(int * mapping, int i) { for(int j = 0; j < N; ++j) // 遍歷每一列 { if(i >= N) // 當第八列完成放置後 { print(mapping); ++count; return; } if(isokay(mapping, i, j)) { mapping[i] = j; solution(mapping, i + 1); } } } int main() { int mapping[N] = {0}; // 定義長度為8的陣列存放擺放位置 solution(mapping, 0); cout << "count:" << count; return 0; }