蚊子可真多啊

从住处到办公场所,室外更不用说,蚊子无处不在。
展开阅读全文

关于PTA习题大炮打蚊子的一点疑惑,提交显示答案正确,段错误?

09-09
背景: 现在,我们用大炮来打蚊子蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数。 输入格式: 第一行为两个不超过20的正整数M和N,中间空一格,表示二维平面有M行、N列。 接下来M行,每行有N个0或者#字符,其中#表示所在格子有蚊子。 接下来一行,包含一个不超过400的正整数k,表示发射炮弹的数量。 最后k行,每行包括一发炮弹的整数坐标x和y(0≤x<M,0≤y<N),之间用一个空格间隔。 输出格式: 对应输入的k发炮弹,输出共有k行,第i行即第i发炮弹消灭的蚊子数。 输入样例: 5 6 00#00# 000### 00#000 000000 00#000 2 1 2 1 4 输出样例: 0 2 ``` int main(void) { int M, N; int i, j; int k, count = 0; char **a; int *x, *y; // 行列 scanf("%d %d", &M, &N); if(M>0&&M<20 && N>0&&N<20) { // 动态分配内存 // 行指针 a = (char **)malloc(sizeof(char *)*M); for(i = 0;i < M;i++) { a[i] = (char *)malloc(sizeof(char)*N); } // 得到蚊子分布图 for(i = 0;i < M;i++) { getchar(); for(j = 0;j < N;j++) { a[i][j] = getchar(); } } // 炮弹数量 scanf("%d", &k); // 动态分配一维数组存储炮弹命中坐标 x = (int *)malloc(sizeof(int)*k); y = (int *)malloc(sizeof(int)*k); if(k>0 && k<400) { for(i = 0;i < k;i++) { scanf("%d %d", &x[i], &y[i]); } for(i = 0;i < k;i++) { if(x[i]>=0&&x[i]<M&&y[i]>=0&&y[i]<N) { // 第一发炮弹 if(i == 0) { // 直接命中,蚊子消失,生命为0 if(a[x[i]][y[i]] == '#') { a[x[i]][y[i]] = '0'; count++; } // 炮弹波及上下左右的蚊子,标记蚊子生命为1 if(a[x[i]][y[i]+1] == '#') { a[x[i]][y[i]+1] = '1'; } if(a[x[i]][y[i]-1] == '#') { a[x[i]][y[i]-1] = '1'; } if(a[x[i]+1][y[i]] == '#') { a[x[i]+1][y[i]] = '1'; } if(a[x[i]-1][y[i]] == '#') { a[x[i]-1][y[i]] = '1'; } } else { // 直接命中,或命中生命为1的蚊子蚊子消失 if(a[x[i]][y[i]] == '#' || a[x[i]][y[i]] == '1') { a[x[i]][y[i]] = '0'; count++; } // 波及生命为1的蚊子蚊子消失 if(a[x[i]][y[i]+1] == '1') { a[x[i]][y[i]+1] = '0'; count++; } else if(a[x[i]][y[i]+1] == '#')// 波及健全的蚊子,标记蚊子生命为1 { a[x[i]][y[i]+1] = '1'; } if(a[x[i]][y[i]-1] == '1') { a[x[i]][y[i]-1] = '0'; count++; } else if(a[x[i]][y[i]-1] == '#') { a[x[i]][y[i]-1] = '1'; } if(a[x[i]+1][y[i]] == '1') { a[x[i]+1][y[i]] = '0'; count++; } else if(a[x[i]+1][y[i]] == '#') { a[x[i]+1][y[i]] = '1'; } if(a[x[i]-1][y[i]] == '1') { a[x[i]-1][y[i]] = '0'; count++; } else if(a[x[i]-1][y[i]] == '#') { a[x[i]-1][y[i]] = '1'; } } } printf("%d\n", count); count = 0; } } } // 释放内存 for(i = 0;i < M;i++) { free(a[i]); } free(a); free(x); free(y); return 0; } ```

pta:大炮打蚊子,有点小bug,求大神帮忙解决一下

12-04
现在,我们用大炮来打蚊子蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数。 输入格式: 第一行为两个不超过20的正整数M和N,中间空一格,表示二维平面有M行、N列。 接下来M行,每行有N个0或者#字符,其中#表示所在格子有蚊子。 接下来一行,包含一个不超过400的正整数k,表示发射炮弹的数量。 最后k行,每行包括一发炮弹的整数坐标x和y(0≤x<M,0≤y<N),之间用一个空格间隔。 输出格式: 对应输入的k发炮弹,输出共有k行,第i行即第i发炮弹消灭的蚊子数。 输入样例: 5 6 00#00# 000### 00#000 000000 00#000 2 1 2 1 4 输出样例: 0 2 我的代码如下: #include <iostream> #include <fstream> using namespace std; char **map; int n,m; void fa(int& x,int& y) { int shu=0; if(map[x][y] == '#'||map[x][y] == '1'){ shu++; map[x][y] = '0'; } if(x+1<n && (map[x+1][y]=='#'||map[x+1][y]=='1')) { if(map[x+1][y] == '#') map[x+1][y] = '1'; else if(map[x+1][y]=='1') { map[x+1][y] = '0'; shu++; } } if(x-1>=0 && (map[x-1][y]=='#'||map[x-1][y]=='1')) { if(map[x-1][y] == '#') map[x-1][y] = '1'; else if(map[x-1][y]=='1') { map[x-1][y] = '0'; shu++; } } if(y+1<n && (map[x][y+1]=='#'||map[x][y+1]=='1')) { if(map[x][y+1] == '#') map[x][y+1] = '1'; else if(map[x][y+1]=='1') { map[x][y+1] = '0'; shu++; } } if(y-1>=0 && (map[x][y-1]=='#'||map[x][y-1]=='1')) { if(map[x][y-1] == '#') map[x][y-1] = '1'; else if(map[x][y-1]=='1') { map[x][y-1] = '0'; shu++; } } cout<<shu<<endl; } int main() { ifstream cin("in.txt"); cin>>n>>m; map = new char*[n]; for(int i=0;i<n;i++) map[i] = new char[m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cin>>map[i][j]; } int size; cin>>size; while(size--) { int x,y; cin>>x>>y; fa(x,y); } for(int i=0;i<n;i++) delete []map[i]; return 0; }
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值