【习题集锦】全国青少年NOIP培训教材 ISBN 978-7-305-04246-1
目录
第一章 回溯法
找路径问题
递归代码:
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的更多相关文章
- SAP项目管理模块培训教材
SAP项目管理模块培训教材(PLM210.PLM220.PLM230)分享: http://sap.npbok.com/
- PCB外形加工培训教材
一.目录1.外形加工制程介绍2.外形加工机器介绍3.各制程流程介绍3.1锣板制程3.2V-Cut3.3啤板3.4斜边3.5洗板4.环保5.工业安全 1.0 外形加工制程介绍 外形加工包括: 1.1锣板 ...
- python作业习题集锦
1. 登录作业: 写一个登录程序,登录成功之后,提示XXX欢迎登录,登录失败次数是3次,要校验一下输入为空的情况 for i in range(3): username=input('username ...
- RHCE认证考试教材
前段时间考RHCE7,顺便给大家分享下RHCE6.7的中文教材!毕竟此书是官方的培训教材,还是值得看看!RHEL6.7承前启后的,给个赞! 下载:http://pan.baidu.com/s/1nu9 ...
- 《Swift开发指南》
<Swift开发指南> 基本信息 作者: 关东升 赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...
- windows类书的学习心得(转载)
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 《Unity3D/2D游戏开发从0到1》正式出版发行
<Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息: 书籍的名称: <Uni ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 牛人的ACM经验 (转)
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈 ...
随机推荐
- Android学习笔记_34_自定义窗口标题
1.建好项目之后在它的layout文件夹下创建一个title.xml文件,作为自定义窗口标题的文件. <?xml version="1.0" encoding="u ...
- mysql自连接
自连接: -- 求7369员工编号,姓名,经理编号和经理姓名 select e1.empno,e1.ename,e2.empno,e2.ename from emp e1,emp e2 where e ...
- deep learning学习记录一
最近不小心又赶了一下时髦,在做deep learning.今天去听了复旦吴老师的课程,感觉吴老讲解的还是很清晰的. 上午刚看过cnn,下午讲解的就是这章,相对来说,我听着给了很多启发.
- linux简介及虚拟机安装
1.简介 计算机组成
- javascript跳转页面
<script type="text/javascript"> function openNewTab() { parent.addExampleTab({ id: a ...
- Hibernate学习第一天
Hibernate框架第一天 今天任务 1. 使用Hibernate框架完成对客户的增删改查的操作 教学导航 1. 能够说出Hibernate的执行流程 2. 能够独立使用Hibernate框架完成增 ...
- 工具类(为控件设置圆角) - iOS
为了便于日常开发效率,因此创建了一些小的工具类便于使用.具体 code 如下:声明: /* 为控件添加边框样式_工具类 */ #import <UIKit/UIKit.h> typedef ...
- ABAP术语-Authorization Object
Authorization Object 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/20/1006585.html Element of ...
- Yaf学习(三)----Yaf类库Library和Model的命名规则
1.Yaf的library和model的文件命名规则和调用 1.1在项目中,往往需要封装一些,如redis,不同的产品需要用不同的库等等等,这就涉及到封装 1.在 Yaf 中,我们可以写一个单例模式的 ...
- 为什么不早点使用 Git...
教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013739628770 ...