经典递归八皇后问题
2016-01-08 09:55
246 查看
八皇后问题,是一个古老而著名的问题,是递归算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
代码如下:
代码如下:
#include<stdio.h> #include<stdlib.h> const int N=10; //最多皇后个数 int a ; //存放各皇后所在行号 int count=0; //记录解的个数 void print(int n) //输出一个解 { int i; count++; printf("%d: ",count); for(i=1;i<=n;i++) printf("(%d,%d) ",a[i],i); //a[i]表示皇后所在棋盘的行,i表示皇后所在棋盘的列 printf("\n"); } int find(int i,int k) //测试第k列上i行能否摆上皇后 { int j; j=1; while(j<k) //j=1到k-1是已经放置了皇后的列 { if((a[j]==i)||(abs(a[j]-i)==abs(j-k))) //判断第j列皇后是否在第i行上,位置(x[j],j)与(i,k)是否同对角线 return 0; j++; } return 1; } void place(int k,int n) //第k个皇后放在第k列上 { int i; if(k>n) //所有皇后放置结束 print(n); else for(i=1;i<=n;i++) //第k列上穷举每一个位置 if(find(i,k)) { a[k]=i; place(k+1,n); } } int main() { place(1,8); }
相关文章推荐
- [转][javascript]判断传入参数
- 移动端适配
- 使用freemarker+servlet时,ftl文件乱码问题
- 微信企业号登录授权Java实现根据userid换openid
- java之导包和项目打包
- 让地图视图自适应线路
- 在CentOS 7上给一个网卡分配多个IP地址
- 了解Java Web——入门
- linux常用命令
- 结构型模式之适配器模式
- [leetcode] 92. Reverse Linked List II 解题报告
- OC-整理
- ID生成策略----xml配置
- Mysql Having的用法:对group by之后的分组加限制条件(复制)
- 让地图视图自适应线路
- (转)supertable像excel那样固定table的表头和第一列
- 深入浅析php中sprintf与printf函数的用法及区别
- controller写法
- Linux中link,unlink,close,fclose详解
- easyui知识累计.递增.