八皇后问题
来源:互联网 发布:深圳十六号公寓知乎 编辑:程序博客网 时间:2024/06/05 14:23
#include <stdio.h>#include <stdlib.h>/***八皇后问题:**八皇后问题是一个古老而著名的问题,是回溯算法的典型例题**十九世纪著名的数学家高斯1850年提出:**在8*8的国际象棋上摆放八个皇后后,使其不能相互攻击,即任意两个**皇后都不能处于同一行,同一列或同一斜线上,问有多少种摆法*/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; } } //判断左上方 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;}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(row==8) { 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++) { *(*(chess2+row)+i)=0; } *(*(chess2+row)+j)=1; EightQueen(row+1,n,chess2); } } }}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",count); return 0;}
0 0
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题求解
- 八皇后问题
- 八皇后问题
- 八皇后问题
- MFC的LISTCONTROL使用
- 分布式进阶(一)Windows 7下硬盘安装Ubuntu 14.04图文教程
- schedule_work 工作队列
- haproxy给mysql做负载均衡
- tomcat服务器解析(四) ---- 组成模块分解
- 八皇后问题
- 杭电ACM 2081:手机短号
- 黑马程序员——IOS基础---C语言学习之函数
- 【STL源码剖析读书笔记】【第4章】序列式容器之deque
- ComboBox DisplayMember无法赋值的问题
- 1001.二分查找
- android MediaPlayer
- 蓝桥杯 VIP 基础练习 2n皇后问题
- 【内存管理】分页机制