試題 算法提高 矩形靶
資源限制
時間限制: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;
}