回溯法打印方法介绍
回溯法打印方法介绍
一个全排列的递归算法,非常的简洁,转载自天极网
#include<stdio.h>
voidprint_it(intn,intarr[]);
voidarrange_all(intsize,intarr[],intpos);
intmain()
{
inta[5]={1,2,3,4,5};
arrange_all(5,a,0);
return0;
}
/*
函数名:voidarrange_all(intsize,intarr[],intpos)
描述:打印所有排列
参数:
size要排列的数据个数
arr[]排列存放的数组
pos当前排列位置
*/
voidarrange_all(intsize,intarr[],intpos)
{
inti,tmp;
if(pos+1==size)/*如果已经排到最后*/
{
print_it(size,arr);/*打印数组*/
return;
}
for(i=pos;i<size;i++)/*对当前位置后的所有位置排列*/
{
tmp=arr[pos];/*交换位置*/
arr[pos]=arr[i];
arr[i]=tmp;
/*递归,继续后面的调用*/
arrange_all(size,arr,pos+1);
/*在交换回来,保持原有的排列次序*/
tmp=arr[pos];
arr[pos]=arr[i];
arr[i]=tmp;
}
}
voidprint_it(intn,intarr[])
{
inti;
staticintcnt=0;
printf("%04d: ",++cnt);
for(i=0;i<n;i++)
printf("%2d",arr[i]);
printf(" ");
}
voidprint_it(intn,intarr[]);
voidarrange_all(intsize,intarr[],intpos);
intmain()
{
inta[5]={1,2,3,4,5};
arrange_all(5,a,0);
return0;
}
/*
函数名:voidarrange_all(intsize,intarr[],intpos)
描述:打印所有排列
参数:
size要排列的数据个数
arr[]排列存放的数组
pos当前排列位置
*/
voidarrange_all(intsize,intarr[],intpos)
{
inti,tmp;
if(pos+1==size)/*如果已经排到最后*/
{
print_it(size,arr);/*打印数组*/
return;
}
for(i=pos;i<size;i++)/*对当前位置后的所有位置排列*/
{
tmp=arr[pos];/*交换位置*/
arr[pos]=arr[i];
arr[i]=tmp;
/*递归,继续后面的调用*/
arrange_all(size,arr,pos+1);
/*在交换回来,保持原有的排列次序*/
tmp=arr[pos];
arr[pos]=arr[i];
arr[i]=tmp;
}
}
voidprint_it(intn,intarr[])
{
inti;
staticintcnt=0;
printf("%04d: ",++cnt);
for(i=0;i<n;i++)
printf("%2d",arr[i]);
printf(" ");
}