算法思考---------八皇后
来源:互联网 发布:王侯将相宁有种乎全文 编辑:程序博客网 时间: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
- 算法思考---------八皇后
- 八皇后算法
- 类似八皇后算法
- 八皇后算法
- 八皇后算法-python
- 八皇后 算法改进
- 趣味算法-八皇后
- 八皇后算法
- 八皇后问题[算法]
- 八皇后 & 迷宫 算法
- 八皇后算法
- 八皇后问题算法
- 算法问题-八皇后
- 数据结构-八皇后算法
- 分治算法 - 八皇后
- 算法--八皇后问题
- 八皇后算法
- 算法-八皇后问题
- 题目1356:孩子们的游戏(圆圈中最后剩下的数)
- 使用PDO查询mysql避免SQL注入
- android开发案例之使用JSON数据向服务器提交和获取服务器传递的Json数据
- 智力题 - 称12个小球
- 深入解析U_BOOT_CMD宏
- 算法思考---------八皇后
- Longest Valid Parentheses
- reaper的学习笔记
- python之路(1)
- OpenStack IRC Meeting Agenda
- sql语句中的连接(join)左连接,右连接,全连接,交叉连接
- 第三周作业
- 第二课,梯度下降
- Linux线程技术的概念与技术发展