算法提高 矩形靶

不羁岁月 提交于 2020-02-12 23:05:36

问题描述

  在矩形的世界里任何事物都是矩形的,矩形的枪靶,甚至矩形的子弹。现在给你一张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 <queue>
#include <cstring>
using namespace std;
const int maxn=601;
struct Node{
	int x,y;
}node;

int main(){
	int n,m,l,r;
	int tu[maxn][maxn];
	char G[maxn];
	queue<Node> q;
	scanf("%d%d%d%d",&n,&m,&l,&r);
	getchar();//吸收多余的空格 
	for(int i=0;i<n;i++){
		gets(G);
		for(int j=0;j<m;j++){
			tu[i][j]=G[j]-'0';//将字符串存到数组里 
			if(tu[i][j]==1){
				node.x=i;
				node.y=j;
				q.push(node);//存1的位置 
			}
		}
	}
	
	while(!q.empty()){
		Node top=q.front();
		q.pop();
		for(int i=top.x-l;i<=top.x+l;i++){//以top.x,top.y为中心点枚举->正方形 
			for(int j=top.y-r;j<=top.y+r;j++){
				int newx=i;
				int newy=j;
				if(newx<n&&newx>=0&&newy<m&&newy>=0){//边界 
					tu[newx][newy]=1;	
				}	
			}
		}
	}
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			printf("%d",tu[i][j]);	
		}
		printf("\n");
	}
	return 0;
}

 

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