【模拟】锁_密码题

锁的密码是八个[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

发布了16 篇原创文章 · 获赞 0 · 访问量 111

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/104487591