八皇后问题描述大家都比较熟悉,就是在8*8的方格中放置8个皇后,使得8个皇后不在同一行、同一列以及不在对角线上,这样8个皇后才不会互相攻击,求放置的方法有多少种?
答案就是92种。
解题思路:假设用C[j]表示皇后在j行代表的列号,也即皇后的位置第j行第C[j]列采用行列表示为[j,C[j]],j和C[j]的值都是07,放置方法就是从第0行开始放置,然后放置第1行,第2行,……依次类推,放完了第7行说明8个皇后都放置了,就表明找到了一个放置方法,第cur行是否可以放置的判断的标准就是当前放置的皇后不能与前面的皇后在相同的列或成对角线,由于是按行放置,所以已经保证了后来放置的皇后与前面的皇后不在同一行,就不需要判断是否在相同的行了。
这里采用python和C++实现,主要是思想,其他语言也一样
#include <iostream> #define N (8) int C[N] ={0}; int tot = 0; //方法计数 void search(int cur) { int row = 0; int col = 0; int flag; if(N == cur) //如果cur==8,那么说明0-7行放置完成,找到一个方法 { tot++; } else { for(col = 0; col < N;col++) //列循环,看第cur个皇后是否可以放置在第i列 { flag = 1; C[cur] = col; //放置在第i列 for(row = 0; row < cur;row++) //行循环,看第cur行是否和0-(cur-1)行有冲突,C[j]表示第j行上放置的皇后的列 { //是否同一列,或者正对角线,或者反对角线 if((C[cur] == C[row]) || (C[cur] - C[row] == cur - row) || (C[cur] - C[row] == row - cur) ) { flag = 0; break; } } if(flag) //如果第cur行放置成功,那么就放置下一行也即cur+1行 { search(cur+1); } } } } int main() { search(0); //从第0行开始放置 cout<<tot<<endl; return 0; }