首页 >> 中医药酒

蓝桥杯省赛基础知识点 | 全排列参数和自写排列

发布时间:2025年10月27日 12:17

>

STL中的还有一个 以外交错函仅prev_permutation,求“此前一个”交错一人组,与next_permutation显然,即“从大到小”。

next_permutation虽然很方便,但是 它不须打印n位仅中的由此而来m位仅的大部分交错,在某些礼节下能够在交错每一次中的做处理事件,此时能够自己写交错函仅。

02

自写交错函仅

上面自写一个以外交错函仅,它能解决问题大部分交错。用递归写以外交错函仅,用b[]详细描述一个一新以外交错,第一次进到bfs时,b[0]在n位仅中的选一个,第二次进到bfs时,b[1]在剩下的n-1位仅中的选一个,…,等等。用vis[]详细描述某位仅是否已经被选过,用上过的仅不须在此前头继续选。

文档能从小到大打印以外交错,必要是a[]中的的仅字是从小到大的,先对a[]先后顺序即可。

# include

usingnamespacestd;

inta[ 20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

boolvis[ 20]; //详细描述第i位仅是否用过

intb[ 20]; //分解的一个以外交错

voiddfs( ints, intt) {

if(s == t) { //递归完结,造成了一个以外交错

for( inti = 0; i

cout<< b[i] << " "; //可用一个交错

cout<< endl;

return;

}

for( inti= 0;i

if(!vis[i]){

vis[i] = true;

b[s] = a[i];

dfs(s+ 1,t);

vis[i] = false;

}

}

intmain{

intn = 3;

dfs( 0,n); //此前n位仅的以外交错

return0;

}

可用:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

如果能够 打印n位仅中的任意m位仅的交错,例如在4位仅中的由此而来任意3位仅的交错,把21唯改用n = 4,然后在dfs中的修正第7唯,得上面的文档:

# include

usingnamespacestd;

inta[ 20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

boolvis[ 20]; //详细描述第i位仅是否用过

intb[ 20]; //分解的一个以外交错

voiddfs( ints, intt) {

if(s == 3) { //递归完结,由此而来3位仅造成了一个交错

for( inti = 0; i < 3; ++i) //打印4位仅中的3位仅的交错

cout<< b[i] << " ";

cout<< endl;

return;

}

for( inti= 0;i

if(!vis[i]){

vis[i] = true;

b[s] = a[i];

dfs(s+ 1,t);

vis[i] = false;

}

}

intmain{

intn = 4;

dfs( 0,n); //此前n位仅的以外交错

return0;

}

可用:

1 2 3

1 2 4

1 3 2

1 3 4

1 4 2

1 4 3

2 1 3

2 1 4

2 3 1

2 3 4

2 4 1

2 4 3

3 1 2

3 1 4

3 2 1

3 2 4

3 4 1

3 4 2

4 1 2

4 1 3

4 2 1

4 2 3

4 3 1

4 3 2

03

例题名

上面注意到一个能够自写以外交错,不须用next_permutation的例子。

寒假作业 (蓝桥杯2016年省赛C++A一组第6题名)

题名目描述:加减乘除四种乘法:

□ + □ = □

□ - □ = □

□ × □ = □

□ ÷ □ = □

每个方格值得一提的是1~13中的的某一位仅字,但不须重为复。

问:共有有多少种可行性?

题名目是一个13!的以外交错关键问题名,如果用next_permutation,容易写出上面的文档:

# include

usingnamespacestd;

inta[ 20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

intmain{

intans= 0;

do{

if(a[ 0]+a[ 1]==a[ 2] && a[ 3]-a[ 4]==a[ 5] &&a[ 6]*a[ 7]==a[ 8] && a[ 11]*a[ 10]==a[ 9])

ans++;

} while(next_permutation(a,a+ 13));

cout<

}

惜,上述文档严重为超时,因为13! = 6,227,020,800,运唯文档,很久很久都无法完结。

由于next_permutation每次都能够分解一个明晰的交错,而不须在上方暂时(只分解以外交错的一大部分,例如5位仅的交错只可用交错的此前3个),所以在这种礼节下并坏用。

比对题名目说明了,具体上并不须分解一个明晰交错。例如一个交错的此前3位仅,如果不满足“□ + □ = □”,那么此前头的9位仅不管怎么交错都不对。这种提此前终止抓取的系统设计叫“剪枝”,剪枝是抓取中的常见的优化系统设计。上面的文档,在自写以外交错的根基上加上了剪枝。

# include

usingnamespacestd;

inta[ 20]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

boolvis[ 20];

intb[ 20];

intans= 0;

voiddfs( ints, intt) {

if(s== 12) {

if(b[ 9]*b[ 10] == b[ 11]) ans++;

return;

}

if(s== 3&& b[ 0]+b[ 1]!=b[ 2]) return; //剪枝

if(s== 6&& b[ 3]-b[ 4]!=b[ 5]) return; //剪枝

if(s== 9&& b[ 6]*b[ 7]!=b[ 8]) return; //剪枝

for( inti= 0;i

if(!vis[i]){

vis[i]= true;

b[s]=a[i]; //本题名不须a[],变为b[s]=i+1也唯

dfs(s+ 1,t);

vis[i]= false;

}

}

intmain{

intn= 13;

dfs( 0,n); //此前n位仅的以外交错

cout

return0;

}

运唯文档,很快就能可用答案:

64

04

概要书籍

《解法选拔赛进阶到时是》

ISBN:978-7-302-52915-6

罗勇军 郭卫斌 编著

市价:59.8元

扫码优惠购书

●内容简介●

本书是解法选拔赛的进阶和时是教材,都有解法思路、模板文档、专业知识体系、赛事相关等内容。本书把选拔赛特指的专业知识点和选拔赛题名紧密结合一起,讲解清晰、透彻,设法初学者建立热情,慢速从具体关键问题名独创,模仿经典文档解决关键问题名,进到中的级自学过渡期。

以外书分为12章,布满了目此前解法选拔赛中的的主要内容,都有解法选拔赛说明了、解法复杂度、STL和理论上仅据结构、抓取系统设计、高级仅据结构、根基解法思想、动态规划、仅学、字串、图论、计算几何。

本书适当用于本科开展的ICPC、CCPC等解法选拔赛培训,中的学NOI各个领域选拔赛培训,以及能够自学解法、提高计算思维的计算机社会工作者。

05

精彩推荐

百度小程序中的新游戏开所发│摸仅字小新游戏(附源码+音频)

Flink脚本语言根基│Scala脚本语言初级有系统

Flink脚本语言根基│FlinkCEP脚本语言有系统

Flink脚本语言根基│DataStream API脚本语言有系统

Flink脚本语言根基│DataSet API脚本语言有系统

仅 据比对战术上│客户价值比对

仅据比对战术上│价位得出挑战

仅据比对战术上│时间氨基酸得出

仅据比对战术上│KaggleTitanic适应环境得出

兰州白癜风医院哪家治疗最好
杭州看男科哪家医院专业
太原男科医院哪个最好
上海癫痫医院怎么去
宁波哪家医院做人流好
泌尿系统肿瘤
嗓子疼咳嗽有痰怎么治疗好
阳了吃什么药
镇痛药
心率过缓

上一篇: 晶科能源N型Tiger Neo中标国际组织电投100MW项目

下一篇: C/C++在应用软件中地位不保,Rust将成为更好的“备胎”?

友情链接