通过求全排列来学习回溯法,回溯法的理解很重要。
#include<stdio.h>
int b[100]; //用于储存已经排好的序列
bool used[100]; // 判断哪些数字已经排过
int n; // 1-n 的全排列
int sum=0; // 统计有多少排列数
void output() // 打印好排列数
{
printf("第%d中组合: \t",++sum);
for(int i=1;i<=n;i++)
{
printf("%d",b[i]);
}
printf("\n");
}
void solve(int k) // 从第一个数开始排
{
for(int i=1;i<=n;i++) // 把数字:1-n,填到数组前k个中
{
if(!used[i])
{
b[k]=i;
used[i]=1;
if(k==n) // 递归层数 //拍到第n个数后打印出来
{output();} // 打印出来
else
{solve(k+1);}
used[i]=0;
}
}
}
int main()
{
n=4; // 从1到 n 的排列数
solve(1);
printf("ok\n");
return 0;
}
<img src="https://img-blog.csdn.net/20150123210008397?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDA4OTc3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />