一、前言
这篇文章稍微总结一类用dfs的全排列解决的从1到9选数的问题。
各个oj相关题目链接如下:
2.C-排列式_算法综合训练1—程序结构 (nowcoder.com)(此题答案直接给出,但建议自己编写程序解决)
3.P1008 [NOIP1998 普及组] 三连击 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
4.P1618 三连击(升级版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
二、分析
1.特征:这类问题的特征是使用1~n(1<=n<=9,n为整数)各一次组成不同的数,进而求满足条件的组数。为什么n是1到9的整数呢,因为1s内最多只能求出9的所有全排列。
2.思路:先求出所有全排列,然后用for循环枚举特殊的位置,以第一题为例;可以用两个for循环分别枚举加号和分号的位置,然后根据函数求出在几个符号之间的数的大小进而进行进一步的判断;关键代码如下:
for(int i=1;i<=ans;i++)
for(int j=1;j<8;j++)
for(int k=j+1;k<9;k++)
{
int num2=cal2(base[i],1,j);
int num3=cal2(base[i],j+1,k);
int num4=cal2(base[i],k+1,9);
if(num3%num4==0&&target==num2+num3/num4)cnt++;
}