深搜题目题解

来源:互联网 发布:手机淘宝店如何推广 编辑:程序博客网 时间:2024/05/22 05:31

1,输入一个数n,输出1~n的全排列.

#include<stdio.h>int a[10],book[10],n;//C语言的全局变量在没有赋值的时候默认为0 void dfs(int step)  //step表示现在站在第几个盒子面前 {int i;if(step==n+1)//如果站在第n+1个盒子之前,表示前n个盒子已经放好扑克牌 {//输出一种序列for(i=1;i<=n;i++){printf("%d",a[i]);} printf("\n");return;      //返回之前的一步(最近一次调用dfs函数的地方) } //此时站在第step个盒子面前,应该放哪一张牌呢?//按照1,2,3...n的顺序一一尝试for(i=1;i<=n;i++){//判断扑克牌i是否还在手上 if(book[i]==0){//开始尝试使用扑克牌i a[step]=i;book[i]=1;//将book[i]设为1表示i号扑克牌已经不在手上dfs(step+1);//通过函数的递归调用来实现 book[i]=0;// 非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一步尝试 } } }int main() {printf("请输入n:");scanf("%d",&n);printf("排列分别为\n"); dfs(1);//首先站在第1号盒子面前 return 0;} 

2,手中有1~9的九张牌,然后把这九张牌放到九个盒子里,使得_ _ _+_ _ _=_ _ _ 成立。

#include<stdio.h>int a[10],book[10],total;//C语言的全局变量在没有赋值的时候默认为0 void dfs(int step)  //step表示现在站在第几个盒子面前 {int i;if(step==10)//如果站在第n+1个盒子之前,表示前n个盒子已经放好扑克牌 {//判断是否满足要求 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]) {//如果满足要求,可行解+1,并打印这个解total++;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函数的地方) } //此时站在第step个盒子面前,应该放哪一张牌呢?//按照1,2,3...n的顺序一一尝试for(i=1;i<=9;i++){//判断扑克牌i是否还在手上 if(book[i]==0){//开始尝试使用扑克牌i a[step]=i;book[i]=1;//将book[i]设为1表示i号扑克牌已经不在手上dfs(step+1);//通过函数的递归调用来实现 book[i]=0;// 非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一步尝试 } } return;}int main() {dfs(1);//首先站在第1号盒子面前     printf("total=%d",total/2);return 0;} 



0 0