递归的基本概念

一个函数调用其自身,就是递归

递归的作用

1) 替代多重循环

2) 解决本来就是用递归形式定义的问题

3) 将问题分解为规模更小的子问题进行求解

一行只能有一个皇后,这个根据游戏规则中的皇后的势力就可以得知。

首先先让A皇后放在左上角(0,0),B皇后再从第二行找到合适的位置,以此类推C皇后在第三行找到合适的位置,一直到N皇后,一组解就出来了,但是问题并不是这么简单。

假设现在是4皇后问题,第A个皇后在(0,0)B皇后在(1,3)

C皇后在(3,1)此时D皇后就无位置可以放置。

细心的你,可能会有疑问,每次D皇后,找不到合适的位置,就去让BC重新寻找位置,当BC皇后在它所处的行,再也找不到合适的位置,A皇后的位置就需要变动了。棋盘上就一个皇后A,寻找他的合适位置只需右移一个位置即可。A皇后位移后,再去为BC皇后找合适位置,如果有合适位置,就再去为D皇后寻找合适的位置;如果BC皇后都没有合适的位置,就需要再次右移A皇后,循环上面的过程。

#include<bits/stdc++.h>
using namespace std;
int N;
int queenPos[100];
/*用来存放算好的皇后位置。最左上角是(0,0)
每一行都有一个只用记录它的列坐标*/
void NQueen(int k);
int main()
{
cin >> N;
NQueen(0); //从第0行开始摆皇后
return 0;
}
void NQueen(int k)
{ //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
int i;
if(k==N)
{ // N 个皇后已经摆好
for(i=0;i<N;i++)
cout<<queenPos[i]+1<<" ";
cout<<endl;
return ;
}
for(i=0;i<N;i++)
{ //逐尝试第k个皇后的位置
int j;
for( j = 0; j < k; j ++ )
{//和已经摆好的k 个皇后的位置比较,看是否冲突
if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j)) break;
//冲突,则试下一个位置
}
if( j == k )
{ //当前选的位置i 不冲突
queenPos[k] = i; //将第k个皇后摆放在位置i
NQueen(k+1);
}
}
}

最新文章

  1. CYQ.Data V5 从入门到放弃ORM系列:教程 - AppConfig、AppDebug类的使用
  2. 接口测试第三课(HTTP协议简介) -- 转载
  3. ZOJ Problem Set - 1240 IBM Minus One
  4. Xamarin安装和跳坑指南
  5. selenium.Phantomjs设置浏览器请求头
  6. JS数组类型检测
  7. c++实现简单计算器
  8. C#代码开发规范
  9. Restfull API 示例
  10. input默认提示取消
  11. eclipse 安装egit 成功后Team中没有显示
  12. javascript 将多维数组转换为一维数组
  13. CodeForces - 269C Flawed Flow
  14. 无法识别的属性“targetFramework”
  15. Objective-C基础教程读书笔记(6)
  16. Mac中QT程序发布
  17. Unity3D中切换场景可能导致材质变暗的问题
  18. Dynamics CRM2013 picklist下拉项行数控制
  19. Add In 简介(主要翻译于ESRI官方文档)
  20. volatile 与 JVM 指令重排序

热门文章

  1. 【php】面向对象(五)
  2. javascript入门 之 Ajax(一)
  3. javascript 入门 之select2功能大全
  4. 抓包——HTTP分析
  5. Python+Tornado开发微信公众号
  6. Mac配置hosts文件
  7. 【Selenium06篇】python+selenium实现Web自动化:日志处理
  8. L6循环神经网络
  9. 常用ElasticSearch 查询语句
  10. 纯css画三角形