【ACM暑假培训】递归算法2:数字全排列+字符串全排列

本文深入探讨ACM暑假培训中的递归算法应用,主要讲解如何使用递归实现数字和字符串的全排列。通过确保每个元素唯一访问,达到全排列条件并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,

如果每个数字恰好访问了一次,那么它符合题意,输出。


#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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值