八皇后问题



8皇后问题:如何在8 x 8的国际象棋棋盘上安排8个皇后,使得没有两个皇后能互相攻击?如果两个皇后处在同一行、同一列或同一条对角线上,则她们能互相攻击。)

解向量为长度为8的数组,记为solution。因为共有8个皇后,而棋盘刚好为8*8,所以每一行肯定会有一个皇后,那么我们约定solution[i]表示第i+1个皇后放在第i+1行的第几列。solution中的列从1开始记。

回溯算法的思路是对问题的状态空间树进行深度优先搜索,树的每一层节点代表了对解的每一个分量所做的选择。如果该节点表示的选择符合要求,那么继续向下搜索,否则,尝试下一个选择。如果该层的所有选择都已经尝试过,那么我们向上回溯。

递归版本:

01.void eight_queue_recursive( int *solution, int dimension, int row )  
02.{//dimension表示棋盘的维数,row表示放置第几行的皇后  
03.  
04.       if( row > dimension ) return;  
05.        int i;  
06.       for( i = 0; i < dimension; ++i )//尝试每一列  
07.       {  
08.               solution[row-1] = i+1;  
09.               if( if_valid( solution, row ) )//如果合法  
10.               {  
11.                        if( row < dimension )//还有皇后没放  
12.                                eight_queue_recursive( solution, dimension, row+1 );  
13.                       else  
14.                                print( solution, dimension );  
15.               }  
16.               solution[row-1] = 0;  
17.        }  
18.}  


迭代版本

01.void eight_queue( int *solution, int dimension )  
02.{  
03.        int k = 0;//k表示第几个皇后  
04.        while( k >= 0 )//要判断k是否>0  
05.        {     
06.                while( solution[k] < dimension )//判断k是否会超过dimension  
07.                {     
08.                        solution[k]+=1;  
09.                        if( if_valid( solution, k+1 ) )   
10.                        {     
11.                                if( k < (dimension-1) )  
12.                                        ++k;  
13.                                else  
14.                                        print( solution, dimension );  
15.                        }     
16.                }     
17.                solution[k] = 0;//回溯  
18.                --k;  
19.        }     
20.}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值