开发工具:
文件大小: 1mb
下载次数: 0
上传时间: 2019-07-01
详细说明:
内容包括搜索回溯分治、计算几何、动态规划、背包问题求解、线段树典型求解问题、字典树、图论、差分约束系统、贪心等,适用于大学生ACM竞赛赛前准备训练for第i个旱后的位置=1to8do
∥在本行的8列中去试
f本行本列允许放置皇后then
begin
放置第i个皇后
对放置呈后的位置进行标记
ifi8then输出
|经放完个皇后
else Search(i+l)
∥放置第计1个呈后
对放置皇后的位冒释放标记,尝试下一个位置是否可行
end
#inc ludesiostream'>
#inc lude
using namespace std
ta9];
bool hang9」
∥行标记
bool lie[91
∥列标记
bool xiel[l7I
\标记
bool xie2[17];∥/标记
oid printo
al
printf("<%od>. " total
int Fo
for(Fl; iy
printf("%d", a[j]);
printf(n")
void scarch(int t)
int io
for(Fl; 1<9; t+1)
∥搜索所有的可能性
if (hanglt] &&lic[i&&xicI[(t-1)+8]&&xic2[t+i)
a[t]=i
hang[]=ic[i]=xiel[t)+8]=xi2tij- false;∥改变标记
得到种答案
printo;
Else
/没有得到,则继续搜索
hang[t-ie[i-xiel[(ti+8]xie2t+i]-true;/把标记改回来,继续搜
mcmsct(hang, truc, sizeof(hang)
memset(lie, true, sizeof(lie))
memset(xiel, true, sizeof(xiel))
memset(xie, true, sizeof(xie2)
total
printf("total: %od\n, total)
(例2)素数环
素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数
算法分析】
非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数
合法:与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第
1个数的和是否素数。
【算法流稈】
l、数据初始化;2、递归填数:判断第J种可能是否合汯
A、如果合法:填数:判断是否到达日标(20个己填完):是,打印结果;不是,递归
填下一个
B、如果不合法:选择下一种可能
#inc lude
#includec-cmath
using namespace std
int a[21];
bool b[21]
int total
oid printo
int i0
for(i=1;i<21;+-i
printf("od "a])
printf("in);
har ch
ch=cin. get
g
bool pd(int a, int b)
int c=a+b
double sqrt=sqrt(c*1.0);
int 10
f(c%=0)
false
return true:
id search(int t)
int i0
for(i=1i<=20;-+i)
搜索所有的可能性
if(pd(alt-1l, i)&&bi)
[=i;
bi]=false;
∥变标记
i(t20)
fpd(a20],a[1])∥搜到一种答案
Else
没有搜到,继续搜索
earch(t+1)
b[i]=true;
/把标记改回来
mcmsct(b, truc, sizeof(b))
Lotal(
scarch(1);
cout<<"total: <
#includes algorithm>
using namespace std
int stic knumber bian
bool fla
int sticklength[25]
bool used[25]
void check(int s, int bs, int next)
∥从next根棍的位置开始拼凑长度,s:当前长度bs:已经拼凑的木棍数
Int ns, nbs, 1
if(flag==true)
return
or(i=ncxt;i< sticknumbcr;计+)从ncxt开始搜索
if (used[==tr
continue
if(ns+stic klength[i]>bian)
continue
ns+=sticklength[i
[
if(ns==bian)
=0;
nos
找到了三边,另一边也就不用找了
g
if(flag==true)
break
i(ns==0)∥/如果要重雜凑边要从新开始搜索即从最大的没用的木棍开始
if(nsb:
int maino
//freopen("inLxt","I", Stdin)
int tcstnumber
cin>>testnumber
int 1
while( testnumber--
cin>>sticknumbcr
bian=(
memset(used, 0, stic knumber*sizeof(bool))
for (i=0; i>sticklength[i
bian+=sticklength 1
sort(stic klength, stic klength+sticknumber, cmp)
g
if(bian%4)!=0)不是4的倍数(剪枝2)
flag=false
bian=bian /4
i( sticklength[0]}>bian)第一根木棍的长度大于边长(剪枝1)
flagfals
if( nlag==false)
cout
continue;
ag
check(0,0,0);
if(flag-true
cout<
using namespace std
int a[ 1100]
Int ans
void merge(ints, int mid int)从大到小排序
int b[1100]
Int 1
cout<< merge"aliD)
b[k++]=a1
cout<"a"<<"J;"≤a[<”a["j<":""<
a
(t-j+1)<=0)
as+k]=b[k--I
/* for(is; K<=t; i++)
cout<]<
t)
return
int mid=(s+t)/2
mergesort(s, mid)
mergesort(mid+1, t)
erge(s, mid, t);
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.