网易游戏2017互娱实习笔试编程(竖式填空)

[编程|100分] 竖式填空
时间限制:1秒
空间限制:65536K
题目描述
小Q是名小学生,他最喜欢数学中的加法竖式填空了。例如下面的填空题,每个空格表示1…9中的一个数字。

有时候这种竖式题不一定只有唯一解,小Q很想知道,给定一个这样的竖式,总共可能的解有多少个。
被加数和加数的位数不会超过3位。和的位数不会超过4位。空格只可能存在于被加数和加数中。

输入描述:
每个输入数据包含多个测试点。
第一行为测试点的个数T(T<=30)。
每个测试点包含一行,包含了三个长度大于0的字符串,分别表示被加数,加数和结果。每个字符串之间有一个空格。每个字符串只会包含“X”和“1”…“9”,其中“X”表示竖式中的空格。保证竖式至少有一个解。

输出描述:
对于每个测试点,输出一行,表示一共可能的解的个数。

输入例子:
2
X7 9X 123
X X 4

输出例子:
1
3
(样例解释:样例1的解为27+96,样例2的解为1+3,2+2,3+1。)
代码(递归):

#include<vector>
#include<iostream>
#include<algorithm>
#include<sstream>

void dfsTwo(std::string num, int index, int remain, int& result){
    if (index == num.size()){
        int num_i = stoi(num);
        //std::istringstream(num) >> num_i;
        if (num_i == remain) result++;
        return;
    }
    if (num[index] != 'X') dfsTwo(num, index + 1, remain, result);
    else{
        for (int i = 1; i < 10; ++i){
            num[index] = i + '0';
            dfsTwo(num, index + 1, remain, result);
        }
    }
}

void dfs(std::string numOne, std::string& numTwo, int index, int sum, int& result){
    if (index == numOne.size()){
        int num_i = stoi(numOne);
        //std::istringstream(numOne) >> num_i;
        dfsTwo(numTwo, 0, sum - num_i, result);
        return;
    }
    if (numOne[index] != 'X') 
        dfs(numOne, numTwo, index + 1, sum, result);
    else{
        for (int i = 1; i < 10; ++i){
            numOne[index] = i + '0';
            dfs(numOne, numTwo, index + 1, sum, result);
        }
    }
}

int main(){
    int looper = 0;
    std::cin >> looper;
    for (int i = 0; i < looper; ++i){
        std::string numOne, numTwo;
        std::cin >> numOne >> numTwo;
        std::string sum;
        std::cin >> sum;
        int i_sum = stoi(sum);
        //std::istringstream(sum) >> i_sum;
        int result = 0;
        dfs(numOne, numTwo, 0, i_sum, result);
        std::cout << result << std::endl;
    }

    system("pause");
    return 0;
}

代码(迭代):

#include<vector>
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;

bool isCompatible(int num, const std::string& str){
    const std::string& tmp = std::to_string(num);
    if (tmp.size() != str.size()) return false;
    for (int i = 0; i < str.size(); ++i){
        if (str[i] != 'X' && str[i] != tmp[i]){
            return false;
        }
    }
    return true;
}

int main(){
    int looper = 0;
    std::cin >> looper;
    for (int i = 0; i < looper; ++i){
        std::string numOneStr, numTwoStr, sumStr;
        std::cin >> numOneStr >> numTwoStr >> sumStr;
        int endOne = std::pow(10, numOneStr.size());
        int startOne = endOne / 10;
        int endTwo = std::pow(10, numTwoStr.size());
        int startTwo = endTwo / 10;
        int sum = std::stoi(sumStr);
        int result = 0;
        for (int i = startOne; i < endOne; ++i){
            if (!isCompatible(i, numOneStr)) continue;
            for (int k = startTwo; k < endTwo; ++k){
                if (!isCompatible(k, numTwoStr)) continue;
                result += (i + k == sum) ? 1 : 0;
            }
        }
        std::cout << result << std::endl;
    }

    system("pause");
    return 0;
}

总结:
1.算法渣渣,写得不好的地方还请大大们指教;
2.最近在刷Leetcode,DP类题目,遇到问题一般都是直接先走DFS,再想想如何DP,所以做这题时,直接想到的是递归的解法,算法效率不高,勉强通过;
3.今天又想了一下题目,发现自己当时是太紧张了,因为数据范围有限,用迭代更容易;
4.算法还是太弱了,希望好好刷题,脚踏实地,不断提升自己;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值