蓝桥杯 算法提高 矩形靶(c语言版详细注释)

试题 算法提高 矩形靶

                                                                                  蓝桥杯试题解答汇总链接

资源限制

       时间限制: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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Derrick-Xu

谢大哥打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值