此题可巩固二维数组。
题目背景
初一党应该都知道……
题目描述
话说有一天 linyorson 在“我的世界”开了一个 n×n(n≤100)n×n(n≤100) 的方阵,现在他有 mm 个火把和 kk 个萤石,分别放在 (x1,y1)…(xm,ym)(x1,y1)…(xm,ym) 和 (o1,p1)…(ok,pk)(o1,p1)…(ok,pk) 的位置,没有光或没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?
P.S.火把的照亮范围是:
|暗|暗| 光 |暗|暗|
|暗|光| 光 |光|暗|
|光|光|火把|光|光|
|暗|光| 光 |光|暗|
|暗|暗| 光 |暗|暗|
萤石:
|光|光| 光 |光|光|
|光|光| 光 |光|光|
|光|光|萤石|光|光|
|光|光| 光 |光|光|
|光|光| 光 |光|光|
输入格式
输入共m+k+1行。
第一行为n,m,k。
第2到第m+1行分别是火把的位置xi yi。
第m+2到第m+k+1行分别是萤石的位置oi pi。
注:可能没有萤石,但一定有火把。
所有数据保证在int范围内。
输出格式
有几个点会生出怪物。
输入输出样例
输入 #1
5 1 0 3 3
输出 #1
12
此代码未经检测及质量不高,请仔细甄别!
#include <stdio.h>
int main()
{
int fz[100][100];
int n, m, k;
int i, j;
int x, y;
int h, b, o, p;
scanf("%d%d%d", &n, &m, &k);
//初始化数组为0
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
fz[i][j] = 0;
//火把照亮
for (i = 0; i < m; i++)
{
scanf("%d%d", &h, &b);
x = h - 1;
y = b - 1;
if (x >= 0 && y >= 0 && x < n && y < n)
fz[x][y] = 1;
if (x >= 0 && (y - 1) >= 0 && x < n && (y - 1) < n)
fz[x][y - 1] = 1;
if (x >= 0 && (y - 2) >= 0 && x < n && (y - 2) < n)
fz[x][y - 2] = 1;
if (x >= 0 && (y + 1) >= 0 && x < n && (y + 1) < n)
fz[x][y + 1] = 1;
if (x >= 0 && (y + 2) >= 0 && x < n && (y + 2) < n)
fz[x][y + 2] = 1;
if ((x - 1) >= 0 && y >= 0 && (x - 1) < n && y < n)
fz[x - 1][y] = 1;
if ((x - 2) >= 0 && y >= 0 && (x - 2) < n && y < n)
fz[x - 2][y] = 1;
if ((x + 1) >= 0 && y >= 0 && (x + 1) < n && y < n)
fz[x + 1][y] = 1;
if ((x + 2) >= 0 && y >= 0 && (x + 2) < n && y < n)
fz[x + 2][y] = 1;
if ((x + 1) >= 0 && (y + 1) >= 0 && (x + 1) < n && (y + 1) < n)
fz[x + 1][y + 1] = 1;
if ((x - 1) >= 0 && (y - 1) >= 0 && (x - 1) < n && (y - 1) < n)
fz[x - 1][y - 1] = 1;
if ((x + 1) >= 0 && (y - 1) >= 0 && (x + 1) < n && (y - 1) < n)
fz[x + 1][y - 1] = 1;
if ((x - 1) >= 0 && (y + 1) >= 0 && (x - 1) < n && (y + 1) < n)
fz[x - 1][y + 1] = 1;
}
//萤石照亮
for (i = 0; i < k; i++)
{
scanf("%d%d", &o, &p);
x = o - 1;
y = p - 1;
if (x >= 0 && y >= 0 && x < n && y < n)
fz[x][y] = 1;
if (x >= 0 && (y - 1) >= 0 && x < n && (y - 1) < n)
fz[x][y - 1] = 1;
if (x >= 0 && (y - 2) >= 0 && x < n && (y - 2) < n)
fz[x][y - 2] = 1;
if (x >= 0 && (y + 1) >= 0 && x < n && (y + 1) < n)
fz[x][y + 1] = 1;
if (x >= 0 && (y + 2) >= 0 && x < n && (y + 2) < n)
fz[x][y + 2] = 1;
if ((x - 1) >= 0 && y >= 0 && (x - 1) < n && y < n)
fz[x - 1][y] = 1;
if ((x - 2) >= 0 && y >= 0 && (x - 2) < n && y < n)
fz[x - 2][y] = 1;
if ((x + 1) >= 0 && y >= 0 && (x + 1) < n && y < n)
fz[x + 1][y] = 1;
if ((x + 2) >= 0 && y >= 0 && (x + 2) < n && y < n)
fz[x + 2][y] = 1;
if ((x + 1) >= 0 && (y + 1) >= 0 && (x + 1) < n && (y + 1) < n)
fz[x + 1][y + 1] = 1;
if ((x - 1) >= 0 && (y - 1) >= 0 && (x - 1) < n && (y - 1) < n)
fz[x - 1][y - 1] = 1;
if ((x + 1) >= 0 && (y - 1) >= 0 && (x + 1) < n && (y - 1) < n)
fz[x + 1][y - 1] = 1;
if ((x - 1) >= 0 && (y + 1) >= 0 && (x - 1) < n && (y + 1) < n)
fz[x - 1][y + 1] = 1;
if ((x + 2) >= 0 && (y + 2) >= 0 && (x + 2) < n && (y + 2) < n)
fz[x + 2][y + 2] = 1;
if ((x - 2) >= 0 && (y - 2) >= 0 && (x - 2) < n && (y - 2) < n)
fz[x - 2][y - 2] = 1;
if ((x + 2) >= 0 && (y - 2) >= 0 && (x + 2) < n && (y - 2) < n)
fz[x + 2][y - 2] = 1;
if ((x - 2) >= 0 && (y + 2) >= 0 && (x - 2) < n && (y + 2) < n)
fz[x - 2][y + 2] = 1;
if ((x - 1) >= 0 && (y - 2) >= 0 && (x - 1) < n && (y - 2) < n)
fz[x - 1][y - 2] = 1;
if ((x + 1) >= 0 && (y - 2) >= 0 && (x + 1) < n && (y - 2) < n)
fz[x + 1][y - 2] = 1;
if ((x + 1) >= 0 && (y + 2) >= 0 && (x + 1) < n && (y + 2) < n)
fz[x + 1][y + 2] = 1;
if ((x - 1) >= 0 && (y + 2) >= 0 && (x - 1) < n && (y + 2) < n)
fz[x - 1][y + 2] = 1;
if ((x - 2) >= 0 && (y - 1) >= 0 && (x - 2) < n && (y - 1) < n)
fz[x - 2][y - 1] = 1;
if ((x + 2) >= 0 && (y - 1) >= 0 && (x + 2) < n && (y - 1) < n)
fz[x + 2][y - 1] = 1;
if ((x + 2) >= 0 && (y + 1) >= 0 && (x + 2) < n && (y + 1) < n)
fz[x + 2][y + 1] = 1;
if ((x - 2) >= 0 && (y + 1) >= 0 && (x - 2) < n && (y + 1) < n)
fz[x - 2][y + 1] = 1;
}
//测试地图生成
//for (i = 0; i < n; i++)
//{
// for (j = 0; j < n; j++)
// printf("%d",fz[i][j]);
// printf("\n");
//}
int gw = 0;
//判定怪物生成
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (fz[i][j] == 0)
gw++;
printf("%d", gw);
return 0;
}