虫食算(dfs + 剪枝)

本文介绍了通过深度优先搜索(DFS)和剪枝技术解决NOIP提高组的一道题目——虫食算。在解决过程中,关键在于理解加法进位的性质,即进位只有0或1。通过判断进位情况,可以有效地进行剪枝操作。当最高位进位为0且结果超出给定范围时,直接返回false;如果进位确定,加上进位后继续判断。在实现过程中,需要注意赋值操作要按列进行,避免因循环行而导致错误。
摘要由CSDN通过智能技术生成

最近感觉遇到dfs时根本没什么递归搜索之类的想法,就想找点题做,从简单开始循序渐进,然后就看到这个简单题,做了下发现不是普通的简单题,看了别的网站发现是NOIP提高组的题,所以做完后就来总结一下。  

 

传送门:184. 虫食算 - AcWing题库 

剪枝:因为加法进位只有0或者1,所以如果前面进位不确定,则判断进位为0或者进位为1时a+b是否等于c即可,当最高位时,如果进位为0时都超出n则输出false;如果前面进位确定,则加上进位判断即可,最高位同理。

注意:给bi赋值时,一定要注意是同时给一列赋值,所以第一重循环是循环列,而不是行,在这里debug了许久。

//虫食算
#include <bits/stdc++.h>

using namespace std;

const int N = 10010;

int n, w;
char ai[10][30];
int bi[110], path[110];//bi表示从最低位开始每一列字母分别代表的值, path是bi代表的数字
bool st[110];

bool check(){
    for(int i = n - 1, t = 0; i >= 0; i --){
        int a = ai[1][i] - 'A', b = ai[2][i] - 'A', c = ai[3][i] - &#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值