八皇后
原题:传送门
解题思路:
典型的回溯题,题目需要我们做两件事:统计一共有多少种放法,输出前三种放法(按照字典顺序,正常顺序即可)。
核心代码:
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 }