回溯法解决“八皇后”问题

Technorati 标签: 回溯法, backtrack, 八皇后, eight queens puzzle

        “回溯法”和“八皇后”问题本身不再多做介绍,相信很多人都知道,尤其是学习过数据结构的人。如果还不清楚可以google或者baidu一下,亦或是找本数据结构的书看一下。

        “八皇后”问题:可以简单的理解为在一个8*8的棋盘上,放8个旗子(国际象棋中称为皇后queen),要求这8个棋子中任意两个都不在同一行、列、斜线上。

        “回溯法”用在这里的思路是:
                            1 逐行放置。
                            2 对于每一列,从第1列开始(对应矩阵的第0列),逐列测试其是否存在冲突。
                                 2.1  如果冲突就测试下一列,依次进行;
                                 2.2  如果不冲突,放置下一行;

程序代码如下:(如果想更改皇后数量,直接更改queen_number即可,例如:可衍生出在6*6棋盘上放6个皇后)

#include #include #define queen_number 8 /* 定义皇后数量 */ int chess_board[queen_number][queen_number]; /* 定义棋盘, 自动初始化为0。 1表示该位置有皇后,0表示没有 */ void print_board(){ int row; int column; static int n_solutions; /* 设置为静态变量,自动初始化为0 */ n_solutions += 1; printf( "Solution #%d:/n", n_solutions ); for( row = 0; row < queen_number; row += 1 ){ for( column = 0; column < queen_number; column += 1 ){ if( chess_board[ row ][ column ] ){ printf( " Q" ); }else{ printf( " +" ); } } putchar( '/n' ); } putchar( '/n' ); } /* 检查是否冲突: 1代表冲突,0代表不冲突*/ int conflicts( int row, int column ){ int i; for(i=1; i=0 && chess_board[ row-i][ column ] ){ /* 上 */ return 1; } if( column-i>=0 && chess_board[ row ][ column-i]){ /* 左 */ return 1; } if( column+i=0 && column-i>=0 && chess_board[ row-i][ column-i]){ /* 左上方 */ return 1; } if(row-i>=0&& column+i

参考资料:《C和指针》

 本文链接:http://blog.csdn.net/daheiantian/archive/2011/01/23/6225328.aspx

 

 

你可能感兴趣的:(C,algorithm)