【习题集锦】全国青少年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,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈 ...
随机推荐
- JavaScript闭包简单学习
因为实验室项目要用,所以最近在学习OpenLayers,但是从来没有做过前端呀,坑爹的,硬着头皮上吧 反正正好借这个机会学习一下JS,本来对这门语言也挺感兴趣的,多多少少写过一下JS代码了,差不多学一 ...
- 2018年暑假ACM个人训练题9(动态规划)解题报告
A:m段最大字段和问题 https://www.cnblogs.com/yinbiao/p/9314528.html B:map的使用(根本就不是dp!!!) https://www.cnblogs. ...
- 配置两台Azure服务器,一台加入另一台的ad域加入不进去的问题
AD服务器 10.0.0.4 数据库服务器 10.0.0.5 将数据库服务器加入到AD域中,需要将Azure的DNS改成10.0.0.4 Copy一下
- DHTML---HTML5
1. HTML概述 网页是网站的表现层,各种编程语言(如Java)构成后台的逻辑,我们将后台逻辑做好然后通过页面表达.同时通过网页来与后台进行交互.而Html是我们做网页的基础,由浏览器来解析. 1. ...
- HTML基础之标签简单认识
简介 HTML(Hyper Text Markup Language)译为"超文本标记语言",主要是通过HTML标记对网页中的文本.图片.声音等内容进行描述 HTML之所以称为超文 ...
- code ELIFECYCLE (代码周期)
问题:build 不成功 解决:新建一个dist 文件,没有自动新建dist 文件 问题 :npm run dev 时候 解决:
- LeetCode 中级 - 有序链表转换二叉搜索树(109)
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...
- ABAP术语-Accounting Document
Accounting Document 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/12/991731.html Accounting d ...
- Docker 运行MySQL 5.7
#在opt新建挂载目录 cd /opt #-v 显示创建的目录名 mkdir -vp docker_cfg/mysql/data docker_cfg/mysql/logs docker_cfg/my ...
- ELK的简述安装
一.ElasticSearch集群的安装及其配置 https://www.cnblogs.com/gentle-awen/p/10000801.html 可视化x-pack安装: https://ww ...