问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

智商大考验之排列组合

发布网友 发布时间:2022-04-25 20:32

我来回答

5个回答

热心网友 时间:2022-06-17 04:44

n选m的组合:

#include <stdio.h>
#include <stdlib.h>

void Print(int* beg, int* end)
{
while(beg != end)
printf("%d ", *beg++);
putchar('\n');
}

void C(int n, int m)
{
int i;
int *p1, *p2, *trace_back;

if(n == m)
{
for(i = 0; i < m; ++i)
printf("%d ", i + 1);
return;
}else if(m > n)
return;

p1 = (int*)malloc(sizeof(int) * m);

for(i = 1; i <= m; ++i)
p1[i - 1] = i;

trace_back = p1 + m - 1;

do{
Print(p1, p1 + m);
if(*trace_back < n)
++*trace_back;
else
{
while(*trace_back - *(trace_back - 1) <= 1)
--trace_back;
--trace_back;
++*trace_back;
for(p2 = trace_back + 1; p2 != p1 + m; ++p2)
*p2 = *(p2 - 1) + 1;
trace_back = p1 + m - 1;
}
}while(*p1 != n - m + 1);

Print(p1, p1 + m);

free(p1);

}

int main()
{
C(5, 3);

return 0;
}

n选m的排列:

#include <stdio.h>
#include <stdlib.h>

inline void Swap(int* lhs, int* rhs)
{
int tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}

void Reverse(int* beg, int* end)
{
while(beg < end)
Swap(beg++, --end);
}

void Print(int* beg, int* end)
{
while(beg != end)
printf("%d ", *beg++);
putchar('\n');
}

inline int Cmp(const void* lhs, const void* rhs)
{
return *(const int*)rhs - *(const int*)lhs;
}

void P(int* beg, int* mid, int* end)
{
if(end- mid > 1)
qsort(mid, end - mid, sizeof(int), Cmp);
int* nav = end - 1;
Print(beg, mid);

for(;;)
{
int* tmp = nav;
if(*--nav < *tmp)
{
int* rmbt = end;
while(*--rmbt <= *nav);
Swap(nav, rmbt);
if(tmp <= mid)
{
Reverse(tmp, end);
if(end - mid > 1)
qsort(mid, end - mid, sizeof(int), Cmp);
}
Print(beg, mid);
nav = end - 1;
}
if(nav == beg)
{
Reverse(beg, mid);
break;
}
}
}

int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

P(a, a + 3, a + 5);

return 0;
}

递归全排列:

#include <stdio.h>
#include <stdlib.h>

inline void Swap(int* lhs, int* rhs)
{
int tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}

void Print(int* beg, int* end)
{
while(beg != end)
printf("%d ", *beg++);
putchar('\n');
}

void P(int* cbeg, int* beg, int* end)
{
int* p;
if(beg == end - 1)
Print(cbeg, end);
else
for(p = beg; p != end; ++p)
{
Swap(p, beg);
P(cbeg, beg + 1, end);
Swap(p, beg);
}
}

int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

P(a, a, a + 3);

return 0;
}

还有个递归n选m的,考虑到其实现比较糟糕,所以不写了。

你要哪个?

热心网友 时间:2022-06-17 04:44

#include <fstream>
using namespace std;
ifstream fin ("pl.in");
ofstream fout("pl.out");
int kin(int a[],int t,int m){
//判断a数组中从a[1]~a[t]中是否有m ,判重
for (int i=1;i<=t;i++)
if (a[i]==m) return 1;
return 0;
}
void aout(int a[],int r){
//输出a数组
for (int i=1;i<=r;i++)
fout<<a[i]<<' ';
fout<<endl;
}
int main(){
int n,r,s,i,k;
int a[21];
fin>>n>>r;
i=1;k=1;s=0;
a[i]=k;//试探的数为k,试探位置为i+1
while (i>=0){
while (kin(a,i,k)) k++;
if (k<=n){
i++;//试探成功
a[i]=k;
k=1;
}
else{
k=a[i]+1;
i--;//回溯
}
if(i==r){
aout(a,r);
s++;
k=a[i]+1;
i--;
}
}
fout<<"共有"<<s<<"个数"<<endl;
}

热心网友 时间:2022-06-17 04:45

/*非递归*/
#include<iostream>
using namespace std;
void print(int a[], int n)
{
for (int i=0; i<n; i++) cout<<a[i];
cout<<endl;
}
void swap(int &a, int &b)
{
int t = a; a = b; b = t;
}
void reverse(int a[], int i, int j)
{
while (i<j) swap(a[i++],a[j--]);
}

void main()
{
int i, j, n;
cout<<"n=";
cin>>n;
int* a = new int[n];
for(i = 0; i < n; i++)
a[i] = i + 1;
while (1)
{
print(a, n);
for (i=n-2; i>=0; i--)
if (a[i] < a[i+1]) break;
if (i==-1) break;
for (j=n-1; j>i; j--)
if (a[j] > a[i]) break;
swap(a[i],a[j]);
reverse(a,i+1,n-1);
}
}

热心网友 时间:2022-06-17 04:45

全排列算法很多,比较好的是 邻位交换法,但是算法比较复杂

如果N不大,用递归就可以了

热心网友 时间:2022-06-17 04:46

void permutation(char a[], int m, int n)
{
int i;
char t;
if (m<n-1) {
permutation(a, m+1, n);
for (i=m+1;i<n;i++) {
t=a[m]; a[m]=a[i]; a[i]=t;
permutation(a, m+1, n);

t=a[m]; a[m]=a[i]; a[i]=t;
}
} else
{
printf("%s\n", a);
}
}
int main() {
char a[]="ABCD";
permutation(a, 0,4);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
定金人和尾款人是什么意思 定金人尾款人打工人 【资讯】糖豆人踮踮脚尖进入高手行列,加速器免费版试一下 《糖豆人终极淘汰赛》踮踮脚尖玩法攻略介绍_《糖豆人终极淘汰赛》踮踮... 【资讯】糖豆人攻略踮踮脚尖玩法,网游加速器非常不错 糖豆人终极淘汰赛踮踮脚尖怎么玩介绍_糖豆人终极淘汰赛踮踮脚尖怎么玩... 糖豆人踮踮脚尖滑怎么办-糖豆人踮踮脚尖滑解决方法介绍 糖豆人终极淘汰赛踮踮脚尖怎么过-糖豆人终极淘汰赛踮踮脚尖攻略 苏州桥酒该怎样选购? 苏州本地白酒吴井酒价格怎么样? 武汉至岳阳交通 剑侠世界中的搞笑代码??? 求一部电视剧的名字 剧情是这样的就是讲古代的医术的 里面有个女的叫芍药 然后记得有一次治病是用电鳗电人 天龙八部里怎么说出有趣的话来 哪个单词含有字母bg 把bag换一个字母写15个,怎么写? 请问暗黑破坏神的NEC的BEG鞋的BEG在哪里啊 重读闭音节的结构是“铺音&#10133;元音”还是“铺音&#10133;元音&#10133;铺音”啊? 难搞喔! beg是什么意思 /g/音标单词 短点的单词,至少100个 举出中间是元音字母,三个字母的英文单词组合 bag可以改哪个字母,变成一个新单词 有没有自动把韭菜切成小段的机器?(详细说明请看问题补充) b_g 一个英语单词 beg bugs是什么东西? bag、beg、big、bog、bug。什么意思 给肉馅打水的正确方法 馄饨的做法培训,哪里教得好 做青菜鲜肉馄饨,菜肉比例怎么配哦? 南方馄饨怎么包才好吃? 微信群上的聊天记录有一些能搜索出来有这不能搜索出来是怎么回事?求解! 台湾食品 长松鲜奶口袋饼干深圳哪里有买 如何处理好客户关系 世界钢琴曲排名前100 梦幻西游,70JY头满玛瑙,十方无敌符石多少钱?按我们区100:1200点卡 茅岩莓茶是绿茶吗?属于绿茶类么? 为什么莓茶有梗? 手游梦幻西游登录显示错误代码101什么意思 神雕侠侣手游101还能忘尘不 无限星赏官是101的谁 大话西游手游101级法术修满要多少师门 101是什么游戏?具体描述一下,谢谢。 火影忍者手游修行之路101怎么过 修行之路101 手游cf有101级吗 梦幻手游怎么样才可以把强身开到101 梦幻手游101龙宫,想转职魔王或狮驼,哪个好,平民玩家! 手游刺激战场101活动过了还有渠道买到吗 梦幻西游手游帮派技能要多少帮贡 101到120级 手游问道101级能不能带120的混器? 天降雄狮手游101大漠交战怎么过