2017 计蒜之道 初赛 第四场 (计蒜课比赛)第一题

来源:互联网 发布:程序员没前途 编辑:程序博客网 时间:2024/06/06 20:31

商汤科技致力于引领人工智能核心“深度学习”技术突破,构建人工智能、大数据分析行业解决方案。作为一家人工智能公司,用机器自动地解决各类实际问题自然不在话下。近日,商汤科技推出了一套安全令牌,令牌如下图所示:

安全令牌上的小孔有 nn 行 mm 列,不过有些行和有些列已经用导线整体焊接了,共有 kk 根导线。

我们可以在安全令牌上 不重叠 地焊接若干个小芯片,每个芯片需要在相邻(不能斜着相邻,必须平行于行或列)的两个没有被焊接的小孔上固定。不能固定在已经被整体焊接的行或列上。

安全令牌上最多可以放置多少个芯片,就代表了这个安全令牌对应的校验码。当然,由于安全令牌上小孔的密度会很大,是很难目测出对应的校验码的。你作为商汤科技的实习生,需要写出一个程序,能够自动地算出一个给定的安全令牌的校验码。

输入格式

输入第一行三个整数 n,m(1≤n,m≤100)n,m(1n,m100)k(0≤k≤n+m)k(0kn+m)

接下来输入 kk 行,每行输入两个整数 d(0≤d≤1)d(0d1)cc。如果 d=0d=0,表示第 c(1≤c≤n)c(1cn) 行被整体焊接了,如果 d=1d=1,表示第 c(1≤c≤m)c(1cm) 列被整体焊接了。

输出格式

输出安全令牌对应的校验码。

样例输入

4 5 20 31 4

样例输出

5

0 0 0 1 0 

0 0 0 1 0 

1 1 1 1 1 

0 0 0 1 0 

题目样例的排列情况,具体做法就是 搜索,求出每块0的个数然后除以二(向下取整),然后把所有的加起来,就能得到答案了。

#include <iostream>#include <cmath>#include <string>#include <algorithm>#include <string.h>using namespace std;int map[105][105];int n, m;int area;int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};bool check(int x, int y) {    if (x >= 0 && x < n && y >= 0 && y < m && map[x][y] == 0)        return 1;    else return 0;}void dfs(int x, int y) {    for (int i = 0; i < 4; ++i) {        if (check(x + dir[i][0], y + dir[i][1])) {            area++;            map[x + dir[i][0]][y + dir[i][1]] = 1;            dfs(x + dir[i][0], y + dir[i][1]);        }    }}int main() {    memset(map, 0, sizeof(map));    int ans = 0;    int a;    int x, y;    cin >> n >> m >> a;    for (int i = 0; i < a; ++i) {        cin >> x >> y;        if (x == 1) {            for (int i = 0; i < n; ++i)                map[i][y - 1] = 1;        } else {            for (int i = 0; i < m; ++i)                map[y - 1][i] = 1;        }    }    for (int i = 0; i < n; ++i) {        for (int j = 0; j < m; ++j) {            if (!map[i][j]) {                area = 0;                dfs(i, j);                ans += floor(area/2);            }        }    }    cout << ans << endl;}


阅读全文
0 0