锁的密码是八个[0,9]的数字组成的
代码块:
void dfs(int sum,int four,int nine,int flag,int cnt){
if(sum>52) return;
if(cnt==8){
if(four==nine&&flag&&sum<=52){
ans++;
}
return;
}
for(int i=0;i<10;i++){
if(i==4) dfs(sum+i,four+1,nine,flag,cnt+1);
else if(i==9) dfs(sum+i,four,nine+1,flag,cnt+1);
else if(i==2) dfs(sum+i,four,nine,1,cnt+1);
else dfs(sum+i,four,nine,flag,cnt+1);
}
}
int main(){
dfs(0,0,0,0,0);
cout<<ans<<endl;
return 0;
}
坑点:
1.cnt约束成了9,但应该是8,因为是[0,8),一共8个数
2.一开始写成了
for(int i=0;i<10;i++){
if(i==4) four++;
if(i==9) nine++;
if(i==2) flag=1;
sum=sum+i,cnt++;
dfs(sum,four,nine,flag,cnt);
sum=sum-i,cnt--;
if(i==4) four--;
if(i==9) nine--;
if(i==2) flag=0;
}
这种,就会导致回溯出现问题,啥问题?之后再想。。。。
ps:想到了 就是递归树往下延伸时,如果再次碰到2,返回的时候就会把flag置成0,这样这类方案就都没有被计算在内了。
基本上感觉能用函数传参就直接用。
3.记得兼职,当明显不符合时,其实就可以直接剪掉。
4.在循环里dfs时不要用cnt++,这样传过去的只是cnt不是cnt+1