回溯法——八皇后问题

来源:互联网 发布:网络流行词语有哪些 编辑:程序博客网 时间:2024/04/28 23:54

问题:

在8*8的国际象棋上,摆放8个,皇后,使其不能互相攻击,即:不能是同一行、同一列、同一斜线上,问有多少种摆法?

#include <stdio.h>#define N 8int chess[N];  // 记录可行解,每记录一个,就打印出来。下表为行0~7,值为列0~7int count;  // 记录可行解的个数bool safeJudge( int row, int col ) {        // 判断(row, col)位置能不能放for( int i = 0; i < row; i ++ ) {if( chess[i] == col  // 列 || row - i == col - chess[i] // 主对角线 || row - i == chess[i] - col // 次对角线)return false;}return true;}void print() {printf("第%2d个:", ++ count );for( int i = 0; i < N; i ++ )printf("<%d, %d>%c", i + 1, chess[i], i == N -1 ? '\n' : ',' );}void back_trace( int row = 0 ) { // 以深度优先搜索方式进行搜索for( int col = 0; col < N; col ++ ) {if( safeJudge( row, col ) ) {    // 如果可以放置一个皇后chess[ row ] = col; // 放下皇后,记录该皇后的位置if( row < N - 1  )   // 如果没到最后一行,递归,下一行back_trace ( row + 1 );else   // 如果摆放了8个,则直接打印出来print();}}}int main() {count = 0;for( int i = 0; i < N; i ++ )chess[i] = 0;back_trace( );return 0;}



0 0