代码
#include <iostream>
using namespace std;
int a[9][9], num = 0;
int b[9], c[17], d[17];
void dfs(int line) {
if (line == 9) {
for (int i = 1; i <= 8; i ++) {
for (int j = 1; j <= 8; j ++) {
cout << a[i][j] << " ";
}
cout << endl;
}
cout << "---------------" << endl;
num ++;
return;
}
for (int i = 1; i <= 8; i ++) {
if (b[i] || c[line - i + 8] || d[line + i]) continue;
b[i] = c[line - i + 8] = d[line + i] = 1;
a[line][i] = 1;
dfs(line + 1);
a[line][i] = 0;
b[i] = c[line - i + 8] = d[line + i] = 0;
}
}
int main() {
dfs(1);
cout << "There are " << num << " solutions to the Eight Queens problem";
return 0;
}
讲解
一般来说,大家想到的一般都是枚举法。
对,就是要套八个for循环的那个。
八皇后问题一共有92种解,枚举法要计算1677216次的运算。
效率非常的低,所以不能用这种方法。
要使用深度优先搜索来完成。
深度优先搜索一般不用check函数,都是用列表来保存的。
b数组表示的是列方面的判断。
c和d都是斜线。
至于c和d的偏移值是因为数组下标不能是负数。
做完这些后就基本上就可以了。
dfs
如果在第九行,那么输出值。
遍历格子一到格子八。
如果在数组内,不符合要求,下一次遍历。
否则,添加到数组。
进行下一层的dfs。
把数组中的元素删除。
结尾
好了,这就是八皇后问题的主体,byebye~