14 条题解
-
-1
B1.三连击
思路
这道题刚拿到就想到使用递归一个数位一个数位去推 。 搞一个函数,参数有h表示推到了第几个数位和a,b,c。 a,b,c按照题意理解就行了。
但写代码的时候发现如果不优化递归,时间复杂度会变成,所以用了一个vis数组标记对应的1,2,3......这些数字在前面有没有被用过。
这样就减少了时间复杂度,又满足了题目中1到9每个数字只能用一次的限制条件。Code
#include<bits/stdc++.h> using namespace std; bool vis[105]; void fun(int h,int a,int b,int c) { if(h==10) { if(2*a==b && 3*a==c) cout<<a<<" "<<b<<" "<<c<<endl; return; } for(int i=1;i<=9;i++) { if(!vis[i]) { vis[i]=1; if(h<=3) fun(h+1,a*10+i,b,c); else if(h<=6) fun(h+1,a,b*10+i,c); else fun(h+1,a,b,c*10+i); vis[i]=0; } } } int main() { fun(1,0,0,0); return 0; }
信息
- ID
- 32
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 327
- 已通过
- 174
- 上传者