蓝桥杯 算法提高 矩形靶(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

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

scanf("%s",&a[i]);//因为他数字之间没有空格所以用字符类型处理更方便

}

for(i=0;i

for(j=0;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

for(j=0;j

if(a[i][j]=='1'||a[i][j]==2){//标记为1或者2的既是子弹击中和击毁部分

printf("1");

}

else{//否则输出0

printf("0");

}

}

printf("\n");

}

return 0;

}