2、数字全排列(numlist.pas/in/out)+字符串全排列
列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入一个整数
n(1≤n≤9)
输出由1~n组成的所有不重复的数字序列,每行一个序列,数字与数字之间用空格隔开,行首行尾不留空格。
样例输入:numlist.in
3
样例输出:numlist.out
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
思路:
递归,
设标志数组flag[100],初始化为0,访问后标记为1,
//给定一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列情形。
列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入一个整数
n(1≤n≤9)
输出由1~n组成的所有不重复的数字序列,每行一个序列,数字与数字之间用空格隔开,行首行尾不留空格。
样例输入:numlist.in
3
样例输出:numlist.out
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
思路:
递归,
设标志数组flag[100],初始化为0,访问后标记为1,
如果每个数字恰好访问了一次,那么它符合题意,输出。
#include<stdio.h>
int a[100]={0};
int yes=0;
void find(int m)
{
int m1=m,len=0,flag1=0;
int flag[100]={0};
for(int i=0;m1>0;i++)
{
a[i]=m1%10;
if(a[i]==0)
{
flag1=1;
break;
}
m1=m1/10;
len++;
}
int k=len-1;
for(i=0;i<len&&flag1==0;i++)
{
// printf("flag:%d %d\n",flag[a[k]],a[k]);
if(flag[a[k]]==0)
{
flag[a[k]]=1;
k=(k-(a[k]%len)+len)%len;
}
else
flag1=1;
}
if(flag1==0)
yes=1;
else
yes=0;
}
void main()
{
int M,m;
scanf("%d",&M);
//M=34567;
m=M-1;
while(yes==0)
{
m++;
find(m);
}
printf("%d\n",m);
}
字符串全排列://给定一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列情形。
#include<stdio.h>
#include<string.h>
#define N 10
int flag[N]={0};
char b[N]={0};
int n,j=0;
void DFS(char a[])
{
int i;
if(j==n)
printf("%s\n",b);
for(i=0;i<n;i++)
if(flag[i]==0)
{
b[j]=a[i];
j++;
flag[i]=1;
DFS(a);
flag[i]=0;
j--;
}
}
void main()
{
char str[N];
printf("请输入字符串\n");
scanf("%s",str);
n=strlen(str);
DFS(str);
}