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

為{幸葍}努か 提交于 2020-02-22 05:12:44

试题 算法提高 矩形靶

                                                                                  蓝桥杯试题解答汇总链接

资源限制

       时间限制: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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!