练习用next_permutation解蓝桥杯省赛题_扑克序列
2015-03-08 19:51
351 查看
题目:扑克序列
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
字典序遍历字符数组"223344AA"就行,虽然知道有next_permutation这个函数,却一时想不起来用哪个头文件了,试了几个菜确定是“#include<algorithm>”,用法跟sort差不多,以数组头、数组头加长度为参数,有时可以加个自己写的cmp()。
会用next_permutation,解上面的题就是每次下一next_permutation都记录两个‘A’两个‘2’两个‘3’两个‘4’的位置,当相同字符位置的差分别为2、3、4、5时就满足。
代码:
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int a1,a2,two1,two2,three1,three2,four1,four2;
char chs[10]={'2','2','3','3','4','4','A','A'};
while(true)
{
a1=a2=two1=two2=three1=three2=four1=four2=-1;
for(int i=0;i<8;i++)
{
if(chs[i]=='A'&&a1==-1)a1=i;
else if(chs[i]=='A'&&a1!=-1)a2=i;
else if(chs[i]=='2'&&two1==-1)two1=i;
else if(chs[i]=='2'&&two1!=-1)two2=i;
else if(chs[i]=='3'&&three1==-1)three1=i;
else if(chs[i]=='3'&&three1!=-1)three2=i;
else if(chs[i]=='4'&&four1==-1)four1=i;
else if(chs[i]=='4'&&four1!=-1)four2=i;
}
//cout<<a2-a1<<" "<<two2-two1<<" "<<three2-three1<<" "<<four2-four1<<" "<<chs<<endl;
if(a2-a1==2&&two2-two1==3&&three2-three1==4&&four2-four1==5)
{
cout<<chs<<endl;
//break;
}
if(next_permutation(chs,chs+8)==0)
break;
}
//cout << "Hello world!" << endl;
return 0;
}
结果就是字典序最小的满足要求的序列为2342A3A4。next_perutation函数在对字串处理的同时还返回一个bool型的值,当达到字典序最大是返回0,就可以不再继续了。他还有一个对应的兄弟函数叫prev_permutation,功能和他相反。
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
字典序遍历字符数组"223344AA"就行,虽然知道有next_permutation这个函数,却一时想不起来用哪个头文件了,试了几个菜确定是“#include<algorithm>”,用法跟sort差不多,以数组头、数组头加长度为参数,有时可以加个自己写的cmp()。
会用next_permutation,解上面的题就是每次下一next_permutation都记录两个‘A’两个‘2’两个‘3’两个‘4’的位置,当相同字符位置的差分别为2、3、4、5时就满足。
代码:
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int a1,a2,two1,two2,three1,three2,four1,four2;
char chs[10]={'2','2','3','3','4','4','A','A'};
while(true)
{
a1=a2=two1=two2=three1=three2=four1=four2=-1;
for(int i=0;i<8;i++)
{
if(chs[i]=='A'&&a1==-1)a1=i;
else if(chs[i]=='A'&&a1!=-1)a2=i;
else if(chs[i]=='2'&&two1==-1)two1=i;
else if(chs[i]=='2'&&two1!=-1)two2=i;
else if(chs[i]=='3'&&three1==-1)three1=i;
else if(chs[i]=='3'&&three1!=-1)three2=i;
else if(chs[i]=='4'&&four1==-1)four1=i;
else if(chs[i]=='4'&&four1!=-1)four2=i;
}
//cout<<a2-a1<<" "<<two2-two1<<" "<<three2-three1<<" "<<four2-four1<<" "<<chs<<endl;
if(a2-a1==2&&two2-two1==3&&three2-three1==4&&four2-four1==5)
{
cout<<chs<<endl;
//break;
}
if(next_permutation(chs,chs+8)==0)
break;
}
//cout << "Hello world!" << endl;
return 0;
}
结果就是字典序最小的满足要求的序列为2342A3A4。next_perutation函数在对字串处理的同时还返回一个bool型的值,当达到字典序最大是返回0,就可以不再继续了。他还有一个对应的兄弟函数叫prev_permutation,功能和他相反。
相关文章推荐
- 蓝桥杯 历届试题 扑克序列
- 蓝桥杯练习系统BEGIN-2 入门训练 序列求和
- 扑克序列 蓝桥杯
- 扑克序列——第五届蓝桥杯省赛C语言A组第6题
- 蓝桥杯-扑克序列(Java全排列的实现)
- 蓝桥杯 - 算法提高 排列数 【STL-next_permutation求全排列】
- 蓝桥杯—next_permutation()全排列函数
- 蓝桥杯--入门练习:序列求和
- 蓝桥杯 基础练习 序列求和
- 1/20集训一 STL I.(next_permutation 寻找第N小序列子串) Ignatius and the Princess II
- 蓝桥杯2014年C\C++A组第6题扑克序列
- 蓝桥杯练习: 入门训练 序列求和
- next_permutation习题练习
- 蓝桥杯 方格填数 DFS 全排列 next_permutation用法
- 第七届 蓝桥杯 省赛 第六题 方格填数(next_permutation)
- 怎样找下一个序列: next_permutation
- 第五届蓝桥杯软件类国赛真题-C-A-6_扑克序列
- 蓝桥杯练习:入门训练 序列求和
- 蓝桥杯 六角填数 (next_permutation/新技能)
- 蓝桥杯练习-入门训练-序列求和