算法提高 矩形靶
时间限制: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;
}