回溯用栈实现的4个重要点:
1.回溯的结束条件:栈为空的时候
2.回溯的条件:也即出栈的条件
3.回溯算法深入时候的条件:也即入栈的条件
4.回溯算法深入的状态个数:这个看具体情况
这里拿正整数有序分拆来看一下:
#include <stdio.h>
void main(void)
{
//n:整数大小 s:记录一共有几种有序分拆 i:打印分拆的循环变量 k:升入的状态个数,这里也就是小于4的自然数
int n, s, top, i, k;
int stack[100];
scanf("%d", &n);
stack[0]=n; k=0; s=0; top=0;
while(top>=0)//回溯结束条件
{
k++;//入栈或者出栈后新一轮开始,升入状态都要加1,当然,如栈后从0开始加1,出栈后从回溯的状态开始加1
if(k>n)//出栈条件
{
k=stack[top]; top--; n=n+k;
}
else if(k<=stack[top])//这里为了“有序”,入栈时做了如此的限制
{
top++; stack[top]=k;
n=n-k; k=0;//如栈后不要忘记这里的状态要恢复k=0时
if(n==0)
{
s++;
for(i=1; i<=top; i++)
printf("%d", stack[i]);
printf("\n");
}
}
}
printf("%d", s);
}