对1,2,3进行全排列
思路:
-
建立一个全排列函数perm(参数1:操作的数组,参数2:起始位,参数3:终止位)
-
看待每组数据都可以这样看——第一个数字和剩下的。这样的话就有了初步的思路:
1,(23)接着对23进行全排列
2,(13)接着对13进行全排列
3,(12)接着对12进行全排列 -
每次的操作达到的效果是:缩短操作数的规模,和完成一次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;
}