题目要求:输入一个数n,输出1~n的全排列。
代码:
#include <stdio.h>
int a[10],book[10],n;
void dfs(int step)
{
int i;
if(step==n+1)
{
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
return ;
}
for(i=1;i<=n;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
dfs(1);
}
return 0;
}
类似的一个题目,见下文:
题目要求:用1~9组成一个三位数+三位数=三位数的等式,每个数字只能用一次。
代码:
#include <stdio.h>
int a[10],book[10],t=0;
void dfs(int step)
{
int i;
if(step==10)
{
if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9])
{
t++;
printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
}
return ;//返回最近一次调用dfs函数的地方
}
for(i=1;i<=9;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
return ;
}
}
int main()
{
dfs(1);
printf("t=%d",t/2);
return 0;
}
深度优先搜索模板:
void dfs(int step)
{
判断边界
尝试每一种可能 for(i=1;i<=n;i++)
{
继续下一步 dfs(step+1);
}
返回
}