藍橋杯 算法提高 矩形靶(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章