P4346 [CERC2015]ASCII Addition

知识点:模拟

难度:3

据说这个题之前是黑题,难以置信,这个题的思路就是纯模拟,我没有预处理,首先我们输入输入,然后每一行的前面都加上字符,这是为了统一写法,因为后面的数字都是6列,注意这里要加上的是标点符号,我习惯性的加了空格所以找了好久的错,然后我们开始找加号的位置,这个比较一下就很容易找到了,然后我们分别求加号之前的数字和加号之后的数字,写了一个函数,求某个位置的数字,思路就是很简单的暴力,把这个位置的7行都比较一下,然后我们把和分解,存好,最后输出就好了,确实是难度3的题目,一开始弄个黄题夸张了。

#include <bits/stdc++.h>

using namespace std;

string s[7];
string str[10][7] = {"xxxxx", "x...x", "x...x", "x...x", "x...x", "x...x", "xxxxx",
                     "....x", "....x", "....x", "....x", "....x", "....x", "....x",
                     "xxxxx", "....x", "....x", "xxxxx", "x....", "x....", "xxxxx",
                     "xxxxx", "....x", "....x", "xxxxx", "....x", "....x", "xxxxx",
                     "x...x", "x...x", "x...x", "xxxxx", "....x", "....x", "....x",
                     "xxxxx", "x....", "x....", "xxxxx", "....x", "....x", "xxxxx",
                     "xxxxx", "x....", "x....", "xxxxx", "x...x", "x...x", "xxxxx",
                     "xxxxx", "....x", "....x", "....x", "....x", "....x", "....x",
                     "xxxxx", "x...x", "x...x", "xxxxx", "x...x", "x...x", "xxxxx",
                     "xxxxx", "x...x", "x...x", "xxxxx", "....x", "....x", "xxxxx"};

int solve(int x) {
    string ss[7];
    for (int i = 0; i < 7; i++) ss[i] = s[i].substr(x * 6, 6);
    for (int i = 0; i < 10; i++) {
        int ok = 1;
        for (int j = 0; j < 7; j++) {
            if (ss[j] != "." + str[i][j]) ok = 0;
        }
        if (ok) return i;
    }
}

int main() {
    for (int i = 0; i < 7; i++) {
        cin >> s[i]; s[i] = "." + s[i];
    }
    int ind;
    for (int i = 0; i < 1000; i++) {
        if (s[0].substr(i * 6, 6) == "......") { ind = i; break; }
    }
    long long a = 0, b = 0;
    for (int i = 0; i < ind; i++) {
        a = a * 10 + solve(i);
    }
    for (int i = ind + 1; i < (int) s[0].size() / 6; i++) {
        b = b * 10 + solve(i);
    }
    a += b;
    vector<int> ans;
    while (a) {
        ans.push_back(a % 10);
        a /= 10;
    }
    reverse(ans.begin(), ans.end());
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < (int) ans.size(); j++) {
            cout << str[ans[j]][i] << (j < (int) ans.size() - 1 ? "." : "\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值