目录

第一章 回溯法

找路径问题

递归代码:

procedure find(k:integer); {找第K步的可能性}
begin
if 到目的地 {表示一条路已找出}
then
begin
输出路线;
结束探求
end
else
if <=4
then
for i:=1 to 3 do{穷举三种可能的方向并记录下来}
begin
a[k]:=i;
find(K+1)
end
end;

非递归代码:

begin
a[]:=;k:= {确定起步的路口号及寻找的初始方向}
while 未到目的地 do
begin
while a[k] 无路可走 do {回溯,返回第k-路口,另找一条路}
begin
k:=k-
a[k]:=a[k]+
end;
k:=k+;a[k]:=;{设定从K+1个路口开始寻找的初始方向}
end;
输出路线;
end;

【例1-1】全排列问题

#include "iostream"
using namespace std;
int N,a[];
bool b[];
f(int x)
{
if(x>N)
{
for(int i=;i<=N;i++)
cout<<a[i]<<" ";
cout<<endl;}
else for(int i=;i<=N;i++)
{
if(b[i]!=)
{
a[x]=i;b[i]=;f(x+);b[i]=;
}}}
main()
{
cin>>N;
f();
}

STL解法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include <algorithm>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
int a[];
main()
{
int n,i,j=,k;
cin>>n;
for(i=;i<=n;i++)
{a[i]=n-i+;j*=i;}
for(i=;i<=j;i++)
{next_permutation(a+,a+n+);
for(k=;k<=n;k++)
cout<<" "<<a[k];//排一次输出一次
cout<<endl;
}
return ;
}

【例1-2】邮票问题

涉及到数学优化

#include<iostream>
using namespace std;
int a[],money[];
void bfs(int k,int n,int x)
{
if(n== or k==)
return;
for(int i=n;i>=;i--)
{
x+=a[k]*i;
n=n-i;
money[x]=;
bfs(k-,n,x);
n+=i;
x-=a[k]*i;
}
}
main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=m;i++)
cin>>a[i];
bfs(m,n,);
int temp=,maxlong=;
for(int i=;i<=;i++)
{
if(money[i]== and money[i+]==)
temp++;
else {maxlong=max(temp,maxlong);
temp=;
} }
cout<<maxlong;
}

【例1-3】n皇后问题

#include<iostream>//个人不建议采用头文件,可能和定义的变量或名字起冲突,从而引起编译错误;
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
int a[],b[],c[],d[];
//a数组表示的是行;
//b数组表示的是列;
//c表示的是左下到右上的对角线;
//d表示的是左上到右下的对角线;
int total;//总数:记录解的总数
int n;//输入的数,即N*N的格子,全局变量,搜索中要用
int print()
{
if(total<=)//保证只输出前三个解,如果解超出三个就不再输出,但后面的total还需要继续叠加
{
for(int k=;k<=n;k++)
cout<<a[k]<<" ";//for语句输出
cout<<endl;
}
total++;//total既是总数,也是前三个排列的判断
}
void queen(int i)//搜索与回溯主体
{
if(i>n)
{
print();//输出函数,自己写的
return;
}
else
{
for(int j=;j<=n;j++)//尝试可能的位置
{
if((!b[j])&&(!c[i+j])&&(!d[i-j+n]))//如果没有皇后占领,执行以下程序
{
a[i]=j;//标记i排是第j个
b[j]=;//宣布占领纵列
c[i+j]=;
d[i-j+n]=;
//宣布占领两条对角线
queen(i+);//进一步搜索,下一个皇后
b[j]=;
c[i+j]=;
d[i-j+n]=;
//(回到上一步)清除标记
}
}
}
}
int main()
{
cin>>n;//输入N*N网格,n已在全局中定义
queen();//第一个皇后
cout<<total;//输出可能的总数
return ;
}

注释:对角线d[i-j]后面必须加上一个n,因为i-j可能为负数,那么数组就会出错,所以将整体向右偏移n个单位(坐标偏移不会影响我们需要达到的目的),将所有可能变成正数;(因为i-j的最小值是-n+1,所以加上一个n就一定会变成一个正数)

【习题集锦】全国青少年NOIP培训教材 ISBN 978-7-305-04246-1的更多相关文章

  1. SAP项目管理模块培训教材

    SAP项目管理模块培训教材(PLM210.PLM220.PLM230)分享: http://sap.npbok.com/

  2. PCB外形加工培训教材

    一.目录1.外形加工制程介绍2.外形加工机器介绍3.各制程流程介绍3.1锣板制程3.2V-Cut3.3啤板3.4斜边3.5洗板4.环保5.工业安全 1.0 外形加工制程介绍 外形加工包括: 1.1锣板 ...

  3. python作业习题集锦

    1. 登录作业: 写一个登录程序,登录成功之后,提示XXX欢迎登录,登录失败次数是3次,要校验一下输入为空的情况 for i in range(3): username=input('username ...

  4. RHCE认证考试教材

    前段时间考RHCE7,顺便给大家分享下RHCE6.7的中文教材!毕竟此书是官方的培训教材,还是值得看看!RHEL6.7承前启后的,给个赞! 下载:http://pan.baidu.com/s/1nu9 ...

  5. 《Swift开发指南》

    <Swift开发指南> 基本信息 作者: 关东升    赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...

  6. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  7. 《Unity3D/2D游戏开发从0到1》正式出版发行

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

  8. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  9. 牛人的ACM经验 (转)

    一:知识点     数据结构:       1,单,双链表及循环链表       2,树的表示与存储,二叉树(概念,遍历)二叉树的                    应用(二叉排序树,判定树,博弈 ...

随机推荐

  1. 使用Mosh,本地Mac locale与Remote Debian locale不一致的问题

    事实上, 你并不需要安装语言包, 只需安装中文字体并将/etc/locale.gen 中zh_CN.UTF-8 前的注释符号去掉, 执行sudo locale-gen 然后重启即可.

  2. Entity Framework 六

    实体框架中的存储过程: 我们在创建edmx的时候把存储过程勾选了,所以在我们的上下文上中生成了方法. 存储过程为:就是需要显示多个表的字段.以往需要显示多个表的字段都是新建一个类把需要的字段当做属性写 ...

  3. c/c++面试总结---c语言基础算法总结2

    c/c++面试总结---c语言基础算法总结2 算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的.所有面试过程中重点在考察应聘者基础算法的掌握程度. 上一篇讲解了5中基础的算法,需要在面试之 ...

  4. <逆向学习第三天>手动脱FSG壳,修复IAT。

    其实对于简单的壳来说,脱壳常用的方法也无非是那几种,但是每种有每种的好处,具体使用那种方法视情况而定,我今天学习的这个壳很简单,但是重点在于修复IAT. 一.查壳: FSG 2.0的壳. 二.脱壳: ...

  5. git 上传到码云

    创建分支 在码云里创建好分支 命令行进入项目所在的目录 显示码云上的分支 git pull 选择将要编辑的分支(index-fenzhi) git checkout index-fenzhi 查看分支 ...

  6. mysql 常用函数,基本使用

    1:选中排除表1 连接表2 表3 获取选中表1中部分选中表3 的部分 并且设置选中状态select t1.*,if(t2中t3id=t1.id,1,0)as checked from t1 lefet ...

  7. 移植Linux Kernel SM750 驱动到VxWorks 7

    一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...

  8. python学习——函数

     一.在python的世界里什么是函数: 答:函数通常是用来实现某一个功能二被封装成的一个对象,是用来实现代码复用的常用方式 现在有一个需求,假如你在不知道len()方法的情况下,要你计算字符串‘he ...

  9. go web处理上传

    要使表单能够上传文件,第一步就是添加form的enctype属性,enctype属性有如下三种情况: application/x-www-form-urlencoded 表示在发送前编码所有字符(默认 ...

  10. class实现Stack

    基于class实现一个存储string类型的Stack 头文件: //stack.h #include<vector> #include<string> class Stack ...