大炮打蚊子 ( 数组的应用 )

Posted on 2020-12-18 16:41  金色的省略号  阅读(198)  评论(0编辑  收藏  举报

  代码来源于青岛大学,周强老师的数据结构与算法实战mooc

  算法思想,其一,利用 int 二维数组的值表示是否有蚊子,0表示没有,2表示有,值大于0用来判断有蚊子;其二,简化函数,利用五次调用函数,来实现炮弹落点及对落点上下左右的蚊子的伤害,在落点的蚊子生命减2,不在落点的生命减1,用kill表示减少的值 ( 对应落点或落点的上下左右 );

 

/* 
输入样例

5 6
00#00#
000###
00#000
000000
00#000
2
1 2
1 4

 */
#include <stdio.h>

int board[20][20];
int M,N;

int bang(int x, int y, int kill){  //x,y 是落点或落点上下左右的坐标, kill代表减少的生命值
    if( (x>=0&&x<M) && (y>=0&&y<N) && board[x][y]>0 ){  //x y 合法 且 有蚊子
        board[x][y] -= kill;
        if( board[x][y]<=0 ) return 1;  //  board[x][y]<=0 蚊子被杀死
    } 
    return 0;
}

int main(void)
{
    scanf("%d%d", &M, &N);
    getchar(); //读掉回车
    
    for(int i=0; i<M; ++i){
        for(int j=0; j<N; ++j){
            board[i][j] = getchar()== '0' ? 0 : 2;  // 字符 '0' 
        }
        getchar(); //读掉回车
    }
 
    int k;
    scanf( "%d", &k ); //炮弹数
    
    for(int i=0; i<k; ++i){
        int x, y;
        scanf( "%d%d", &x, &y ); //落点坐标
        int count = 0; 
        count += bang( x, y, 2 ); //落点
        count += bang( x-1, y, 1 ); //落点左
        count += bang( x+1, y, 1 ); //落点右
        count += bang( x, y+1, 1 ); //落点上
        count += bang( x, y-1, 1 ); //落点下
        printf( "%d\n",count );
    }
  
    return 0;
}