第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 I题

像素放置

  • ==问题描述==
  • ==格式输入==
  • ==格式输出==
  • ==样例输入==
  • ==样例输出==
  • ==评测用例规模与约定==
  • ==解析==
  • ==参考程序==

问题描述

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 I题_第1张图片
第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 I题_第2张图片


格式输入

输入的第一行包含两个整数 n, m,用一个空格分隔,表示棋盘大小。接下来 n 行,每行包含 m 个字符,表示棋盘布局。字符可能是数字 0 ∼ 9,这表示网格上的数字;字符还有可能是下划线(ASCII 码为 95 ),表示一个不带有数字的普通网格。


格式输出

输出 n 行,每行包含 m 个字符,表示答案。如果网格填充白色则用字符 0表示,如果网格填充黑色则用字符 1 表示。


样例输入

6 8
1__5_1
1_4__42_
3__6__5_
56
_688___4
___6
【样例输出


样例输出

00011000
00111100
01000010
11111111
01011110
01111110


评测用例规模与约定

对于 50% 的评测用例,1 ≤ n, m ≤ 5 ;
对于所有评测用例,1 ≤ n, m ≤ 10 。


解析

分行,搜索,剪枝,由于题目保证有唯一解,所以搜索的复杂度是正确的。添加链接描述


参考程序

#include "bits/stdc++.h"
 
using namespace std;
using i64 = long long;
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n, m;
    cin >> n >> m;
 
    vector<string> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
 
    vector<vector<int>> ans(n, vector<int>(m, -1));
 
    auto get = [&](int i, int j) {
        array<int, 3> res = {0, 0, 0};
        for (int mx = -1; mx <= 1; mx++) {
            for (int my = -1; my <= 1; my++) {
                int I = i + mx;
                int J = j + my;
                if (I < 0 || I >= n) {
                    continue;
                }
                if (J < 0 || J >= m) {
                    continue;
                }
                if (ans[I][J] == 1) {
                    res[1]++;
                } else if (ans[I][J] == 0) {
                    res[0]++;
                } else {
                    res[2]++;
                }
            }
        }
        return res;
    };
 
    auto check = [&](int i) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] >= '0' && a[i][j] <= '9') {
                int num = a[i][j] - '0';
                auto x = get(i, j);
                int zero = x[0];
                int one = x[1];
                int no = x[2];
                if (one > num) {
                    return false;
                }
                if (no + one < num) {
                    return false;
                }
            }
        }
        return true;
    };
    
    function<void(int, int)> dfs = [&](int i, int j) {
        if (i == n) {
            for (int I = 0; I < n; I++) {
                for (int J = 0; J < m; J++) {
                    cout << ans[I][J];
                }
                cout << '\n';
            }
            return;
        }
        if (j == m) {
            if (i > 0) {
                if (check(i - 1) && check(i)) {
                    dfs(i + 1, 0);
                }
            } else if (check(i)) {
                dfs(i + 1, 0);
            }
            return;
        }
        ans[i][j] = 1;
        dfs(i, j + 1);
        ans[i][j] = 0;
        dfs(i, j + 1);
        ans[i][j] = -1;
    };
 
    dfs(0, 0);
 
    return 0;
}

以个人刷题整理为目的,如若侵权,请联系删除~

你可能感兴趣的:(蓝桥杯,蓝桥杯,c语言,c++)