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
貌似有点压力~~