代码来源于青岛大学,周强老师的数据结构与算法实战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; }