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

C全排列问题

发布网友 发布时间:2022-04-22 18:27

我来回答

4个回答

热心网友 时间:2023-09-15 12:11

对调,对实参无任何影响.
解决上述问题有两个方法:

1.正如楼上所说的,在C++环境下,可以将swap的两个参数改成引用类型,这样对它们的操作将实际作用于实参,实现如下:
函数定义:swap(int &a,int &b);
函数调用示例:swap(*(p+k);*(p+i));其中p是指针,k,i是整形偏移量.

2.在纯C环境下,可以将swap的两个参数改为指针类型,而在函数内部使用对其指向的地址中数据的解引用操作,实现对原变量的对调操作,实现如下:
函数定义:
swap(int *a,int *b)
{int t;
t=*a;
*a=*b;
*b=t;
}
函数调用示例:swap(p+k,p+i);其中p是指针,k,i是整形偏移量.

你的程序中还有两处涉及到指针使用的错误,我把改过的程序贴上来,错误已在注释中标注.

#include "stdio.h"
swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
perm(int *p,int k,int n)
{
int i;
if(k==n-1)
{
for(i=0;i<n;i++)
printf("%d",*(p+i));
printf("\n");
}
else
{
for(i=k;i<n;i++)
{
swap((p+k),(p+i));
perm(p,k+1,n); //原为perm(*p,k+1,n).在此应传递的是指针p指向的地址,而不是该地址中的内容.
swap((p+k),(p+i));
}
}
}
main()
{
int i,list[3],*p;
for(i=0;i<3;i++)
list[i]=i+1;
p=list; //原为p=list[0].这里应将数组list的首地址赋值给指针p,所以就写成p=list或p=&list[0].
perm(p,0,3);
}
另外,虚机团上产品团购,超级便宜

热心网友 时间:2023-09-15 12:11

#include <iostream>
using namespace std;
inline void swap(int &a,int &b)//交换a,b的值
{
int temp=a;
a=b;
b=temp;
}
void perm(int list[],int k,int m)//全排列
{
if(k==m)//输出数组中的数
{
for(int i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
else//对k到m的数进行全排列
for(int i=k;i<=m;i++)
{
swap(list[k],list[i]);
perm(list,k+1,m);//递归
swap(list[k],list[i]);
}
}

void main()
{
int list[3]={1,2,3};
perm(list,0,2);
}

热心网友 时间:2023-09-15 12:12

#include <string.h>
#include <stdlib.h>
int hash[27];
char word[201];
int n;
void dfs(int cur)
{
if(cur>=n)
{
printf("%s\n",word);
return ;
}
int i;
for(i=0;i<26;i++)
if(hash[i])
{
hash[i]--;
word[cur]=i+'a';
dfs(cur+1);
hash[i]++;
}
return ;
}
int main()
{
int i;
scanf("%s",word);
n=strlen(word);
memset(hash,0,sizeof(hash));
for(i=0;i<n;i++)
hash[word[i]-'a']++;
dfs(0);
return 0;
}

楼主看一下,输入一行字符,输出全排列,多个案例的话最外面加个while循环就是了
另外,虚机团上产品团购,超级便宜

热心网友 时间:2023-09-15 12:12

貌似有点压力~~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
超喜欢你的 农行面签 带什么 农行面签需要什么 宝贝药物“黑名单”,爸妈要清楚 借呗用了一次就关闭了怎么办 什么的鸟儿,什么的树木,什么的流水和什么的岩石,汇成了一幅什么的... 什么的小溪填空词语 微信视频号直播“晚安电台”类目怎么上?语音直播开了也不在这个类目中... 帝国时代系列现在出到几了? 以后呢? 求东京巴比伦所有的歌,有罪,soildgold 大都市的孩子,kiss kiss,所有的... C语言全排列问题 C语言的全排列问题!急! c语言求全排列 c语言全排列 C语言如何实现有重复元素的全排列? 看漫画书的软件哪个最好 可以免费看小说和漫画的软件都有哪些 有什么好用看小说,和看漫画的软件! 什么软件既可以免费看小说又可以看漫画? 有哪些好用免费漫画软件或小说软件 手机上有什么看小说漫画的软件?要能下载的 看动漫小说的软件 有什么软件可以看漫画和小说? 触漫兑换码是什么? 触漫如何找到浴衣 触漫可以用自己的漫画人物素材吗 触漫绑定的手机号怎么解绑? 怎样删除脑洞轻推 触漫不要的素材怎么样删除 触漫怎么删除游览记录 用c语言编写全部排列 C语言,关于全排列问题 c语言中全排列问题 C语言 全排列 求助 C语言 全排列······晕 全排列用C语言实现 C语言 全排列问题 c语言全排列递归问题 c需要怎么实现字符串全排列递归实现 C语言题,输出全排列,写下简单代码,要让初学者看懂 c语言 全排列 全排列公式是什么? 当地震发生时,我们该如何自救? 面山药的做法大全 山药和面条能给宝宝吃吗 铁棍山药刀削面是哪里出的 铁棍山药青菜面的做法,铁棍山药青菜面怎么做 一样的面条,南方和北方的面条到底差别在哪 铁棍山药跟面粉揉面做饺子皮好吃吗? 淮山面跟方便面一样吗?