算法思考---------八皇后

来源:互联网 发布:王侯将相宁有种乎全文 编辑:程序博客网 时间:2024/05/17 22:20


一、问题说明

       在8x8格的国际象棋中摆放八个皇后,使其不能相互攻击,及任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

二、代码实现

#include <stdio.h>int count = 0;int notDanger( int row, int j, int (*chess)[8] ){int i, k, flag1=0, flag2=0, flag3=0, flag4=0, flag5=0;// 判断列方向是否危险for( i=0; i < 8; i++ ){if( *(*(chess+i)+j) != 0 ){flag1 = 1;break;}}// 判断左上方是否危险for( i=row, k=j; i>=0 && k>=0; i--, k-- ){if( *(*(chess+i)+k) != 0 ){flag2 = 1;break;}}// 判断右下方是否危险for( i=row, k=j; i<8 && k<8; i++, k++ ){if( *(*(chess+i)+k) != 0 ){flag3 = 1;break;}}// 判断右上方是否危险for( i=row, k=j; i>=0 && k<8; i--, k++ ){if( *(*(chess+i)+k) != 0 ){flag4 = 1;break;}}// 判断左下方是否危险for( i=row, k=j; i<8 && k>=0; i++, k-- ){if( *(*(chess+i)+k) != 0 ){flag5 = 1;break;}}if( flag1 || flag2 || flag3 || flag4 || flag5 ){return 0;}else{return 1;}}// 参数row: 表示起始行// 参数n: 表示列数// 参数(*chess)[8]: 表示指向棋盘每一行的指针void EightQueen( int row, int n, int (*chess)[8] ){int chess2[8][8], i, j;for( i=0; i < 8; i++ ){for( j=0; j < 8; j++ ){chess2[i][j] = chess[i][j];}}if( 8 == row )//递归的出口,当穷举到第九行时不再递归,直接打印棋盘,1代表有皇后,0代表无皇后{printf("第 %d 种\n", count+1);for( i=0; i < 8; i++ ){for( j=0; j < 8; j++ ){printf("%d ", *(*(chess2+i)+j));}printf("\n");}printf("\n");count++;}else{for( j=0; j < n; j++ )//判断这一行的每列是否有危险{if( notDanger( row, j, chess ) ) // 判断是否危险{for( i=0; i < 8; i++ )//将这一行的每列赋值为0{*(*(chess2+row)+i) = 0;}*(*(chess2+row)+j) = 1;//将这一行的这个安全的位置赋值为1EightQueen( row+1, n, chess2 );//如果这一行的某个位置可以放皇后,就}     //进入下一行判断下一行的每个列是否危险,依次递归,直到递归完最后一行,若}             //哪一行的所有列都危险,就返回上一次递归调用,将j加1,再递归。其实这实质}                     //上就是穷举,对于某一行,它的所有列都不能放皇后,就改变上一行放皇后的位}                             //置,及继续判断,将皇后放在之前的皇后之后的位置,若之前皇后之后的位置都                              //危险,就继续往上退一层……int main(){int chess[8][8], i, j;for( i=0; i < 8; i++ ){for( j=0; j < 8; j++ ){chess[i][j] = 0;}}EightQueen( 0, 8, chess );printf("总共有 %d 种解决方法!\n\n", count);return 0;}

三、效果展示



0 0
原创粉丝点击