蓝桥杯 ADV-283 算法提高 矩形靶

算法提高 矩形靶

时间限制:1.0s   内存限制:256.0MB

问题描述

  在矩形的世界里任何事物都是矩形的,矩形的枪靶,甚至矩形的子弹。现在给你一张N*M的枪靶,同时告诉你子弹的大小为(2l+1)*(2r+1)。读入一张01的图每个点的01状态分别表示这个点是否被子弹的中心击中(1表示被击中,0则没有)一旦一个点被子弹的中心击中,那么以这个点为中心 (2l+1)*(2r+1) 范围内靶子上的点都会被击毁。要求输出最终靶子的状态。

输入格式

  第一行为N,M,L,R表示靶子的大小,以及子弹的大小。
  下面读入一个N*M的01矩阵表示每个点是否被子弹的中心击中

输出格式

  N*M的01矩阵表示靶子上的每个点是否被破坏掉

样例输入

4 4 1 1
1000
0000
0000
0010

样例输出

1100
1100
0111
0111

样例输入

7 4 1 1
1000
0000
0010

0000
0000
0000
0100

样例输出

1100
1111
0111
0111
0000
1110
1110

数据规模和约定

  N,M<=600,l,r<=5

#include <stdio.h>
#include <string.h>

int min(int a, int b)
{
    return a < b ? a : b;
}

int max(int a, int b)
{
    return a > b ? a : b;
}

int main()
{
    int N, M, L, R;
    char target[605][605] = { 0 }, state[605][605] = { 0 };

    scanf("%d %d %d %d", &N, &M, &L, &R);
    for (int i = 0; i < N; ++i)
    {
        scanf("%s", target[i]);
        strcpy(state[i], target[i]);
    }

    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < M; ++j)
        {
            if (target[i][j] == '1')
            {
                for (int s = max(0, i - L); s <= min(N - 1, i + L); ++s)
                    for (int r = max(0, j - R); r <= min(M - 1, j + R); ++r)
                        state[s][r] = '1';
            }
        }
    }

    for (int i = 0; i < N; ++i)
        printf("%s\n", state[i]);

    return 0;
}
发布了298 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/104188360