全排列问题

对1,2,3进行全排列

思路

  1. 建立一个全排列函数perm(参数1:操作的数组,参数2:起始位,参数3:终止位)

  2. 看待每组数据都可以这样看——第一个数字和剩下的。这样的话就有了初步的思路:
    1,(23)接着对23进行全排列
    2,(13)接着对13进行全排列
    3,(12)接着对12进行全排列

  3. 每次的操作达到的效果是:缩短操作数的规模,和完成一次swap交换

#include <stdio.h>
void swap(int a[], int x, int y)
{
	int temp;
	temp = a[x];
	a[x] = a[y];
	a[y] = temp;
}
void printa(int a[], int x)
{
	int i;
	for (i = 0; i < x; i++)
		printf("%d", a[i]);
	printf("\n");
}
void perm(int a[], int p, int q)			//操作的数组是a[],p是起始位,q是终止位
{
	int i;
	if (p == q)
	{
		printa(a, q + 1);
	}
	else
	{
		for (i = p; i <= q; i++)
		{
			swap(a, p, i);
			perm(a, p + 1, q);
			swap(a, p, i);
		}
	}
}

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

DFS算法解决

#include<stdio.h>
int a[11], vis[11], n;
void print_a(int a[], int x)
{
	int i;
	for (i = 1; i <= x; i++)
		printf("%d", a[i]);
	printf("\n");
}

void dfs(int step)
{
	int i;
	if (step == n + 1)
	{
		print_a(a, n);
		return;
	}
	
	for (i = 1; i <=n; i++)
	{
		if (vis[i] == 0)
		{
			a[step] = i;
			vis[i] = 1;
			dfs(step + 1);
			vis[i] = 0;
		}
	}
}

int main()
{
	scanf_s("%d", &n);
	dfs(1);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值