试题 算法提高 矩形靶
资源限制
时间限制: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
样例二:
7 4 1 1
1000
0000
0010
0000
0000
0000
0100
样例输出
样例一:
1100
1100
0111
0111
样例二:
1100
1111
0111
0111
0000
1110
1110
数据规模与约定
N,M<=600,l,r<=5
代码
#include <stdio.h>
int main()
{
int n,m,l,r,i,j,y,x;//i,j,x,y用于for循环
scanf("%d%d%d%d",&n,&m,&l,&r);//n,m,l,r对应题目代表的意思
char a[n][m];//a数组用来存储矩形靶
for(i=0;i<n;i++){
scanf("%s",&a[i]);//因为他数字之间没有空格所以用字符类型处理更方便
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(a[i][j]=='1'){//如果是1进入循环
for(x=i-l;x<=i+l;x++){
for(y=j-r;y<=j+r;y++){
if(x==i&&y==j||x<0||y<0||x>=n||y>=m){//本身或者x、y越界时不做处理直接进入下个循环
continue;
}
if(a[x][y]=='0'){//对于被击毁的部分标记为2
a[x][y]=2;//防止该子弹击毁范围内有其他子弹击中,所以标记为2加以区分
}
}
}
}
}
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(a[i][j]=='1'||a[i][j]==2){//标记为1或者2的既是子弹击中和击毁部分
printf("1");
}
else{//否则输出0
printf("0");
}
}
printf("\n");
}
return 0;
}
来源:CSDN
作者:My dream.
链接:https://blog.csdn.net/xyf0209/article/details/104431551