#include <stdio.h>
//数组a代表盒子, book代表扑克牌
int a[10], book[10], n; //C语言的全局变量在没有赋值以前默认为0
//这里的book数组无需全部再赋初始值为0
void dfs(int step);
int main() {
scanf("&d", &n); //输入的时候注意,n为 1~9 之间的整数
dfs(1); // 首先站在一号盒子面前
getchar(); getchar();
return 0;
}
void dfs(int step) // step 表示现在第几个盒子面前
{
int i;
if(step == n+1) //如果站在第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) //book[i]等于0表示i号扑克牌在手上
{
// 开始尝试使用扑克牌i
a[step] = i; // 将i号扑克牌放入到第step个盒子中
book[i] = 1; // 将book[i]标记为1, 表示i号扑克牌已经不在手上了
// 第step个盒子已经放好扑克牌, 接下来需要走到下一个盒子面前
dfs(step+1); //递归调用自己
book[i] = 0; //这是非常重要的一步, 一定要将刚才尝试的扑克牌收回, 才能进行下一次尝试
//放在递归调用后面的语句 , 执行顺序 是反过来的, 所以收回扑克牌是从最后一张放下去的牌开始
}
}
}
/*
// 深度优先搜索的基本模型
void dfs(int step) {
//STEP.1 判断边界 -> 若达到边界, 则return(返回之前一步调用递归的地方)
//STEP.2 尝试每一种可能
for(i=1; i<=n; i++) {
//STEP.3 继续下一步
dfs(step+1);
}
//返回
return;
}
*/
#include <stdio.h>
int a[10], book[10], total=0; // 记数的一定要初始化为0(虽然全局变量默认的值就是0)
void dfs(int step) ;
int main() {
dfs(1); //首先站在第一个盒子面前
printf("total = %d", total/2); // 因为相加的两个数可以对调, 所以除以二
getchar(); getchar();
return 0;
}
void dfs(int step) { // step表示现在站在第几个盒子面前
int i;
if(step == 10) // 如果站在第十个盒子面前, 则表示前九个盒子已经放好扑克牌了
{
// 判断是否满足等式 xxx + xxx = xxx
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; //返回之前的一步(最近调用的地方
}
// 此时站在第step个盒子面前, 应该放哪张牌呢?
// 按照1、2、3...n 的顺序一一尝试
for(i=1; i<=9; i++) {
// 判断扑克牌i是否还在手上
if(book[i] == 0) {
a[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
return;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
怀疑对方AI换脸可以让对方摁鼻子 真人摁下去鼻子会变形
女子野生动物园下车狼悄悄靠近 后车司机按喇叭提醒
睡前玩8分钟手机身体兴奋1小时 还可能让你“变丑”
惊蛰为啥吃梨?倒春寒来不来就看惊蛰
男子高速犯困开智能驾驶出事故 60万刚买的奔驰严重损毁