题目传送门:P1618 三连击(升级版)
这道题考的是枚举,但是我们也可以写一个搜索来解决这道题。
代码:
#include <bits/stdc++.h>
using namespace std;
int ans[10]={0}; // 用于存储DFS过程中生成的数字
bool used[10]={false}; // 用于标记数字是否已经被使用
bool flag=false; // 标记是否找到符合条件的三个数字
int a, b, c; // 从输入中读取的三个数字
// 辅助函数,计算由ans数组中连续三个数字组成的数字
int cf(int cnt){
int sum=0;
for(int i=3*cnt-2;i<=3*cnt;i++){
sum*=10; // 将sum左移一位,准备添加新的数字
sum+=ans[i]; // 将ans[i]添加到sum的末尾
}
return sum; // 返回计算得到的数字
}
// DFS函数,从step开始填充ans数组
void dfs(int step){
// 如果step等于10,说明已经填充完三个数字,检查是否满足条件
if(step==10 && cf(1)*b==cf(2)*a && cf(1)*c==cf(3)*a){
cout<<cf(1)<<" "<<cf(2)<<" "<<cf(3)<<endl; // 如果满足条件,输出这三个数字
flag=true; // 设置flag为true,表示找到了符合条件的数字
return; // 结束搜索
}
// 遍历1到9的数字
for(int i=1;i<=9;i++){
// 如果这个数字还没有被使用
if(!used[i]){
// 标记这个数字为已使用
used[i]=true;
// 将这个数字添加到ans数组的当前位置
ans[step]=i;
// 递归调用dfs,填充下一个位置
dfs(step+1);
// 回溯,将这个数字标记为未使用,以便尝试其他数字
used[i]=false;
}
}
}
int main()
{
// 从输入中读取三个数字
cin>>a>>b>>c;
// 从第一个位置开始DFS搜索
dfs(1);
// 如果没有找到符合条件的数字,输出"No!!!"
if(!flag) cout<<"No!!!";
return 0;
}