intmain() { int chinese[1000], math[1000], english[1000], total[1000]; int n, ans = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d%d%d", &chinese[i], &math[i], &english[i]); total[i] = chinese[i] + math[i] + english[i]; }
for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (abs(chinese[i] - chinese[j]) <= 5 && abs(math[i] - math[j]) <= 5 && abs(english[i] - english[j]) <= 5 && abs(total[i] - total[j]) <= 10) ans++; } }
printf("%d", ans); }
Python 使用二维数组进行实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
n = int(input()) scores = []
for i in range(n): score = list(map(int, input().split())) scores.append(score)
ans = 0 for i in range(n): for j in range(i+1, n): if abs(scores[i][0] - scores[j][0]) <= 5 \ and abs(scores[i][1] - scores[j][1]) <= 5 \ and abs(scores[i][2] - scores[j][2]) <= 5 \ and abs(sum(scores[i]) - sum(scores[j])) <= 10: ans += 1
intmain() { bool monster[100][100]; int n, fire, stone; scanf("%d%d%d", &n, &fire, &stone); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) monster[i][j] = true;
for (int i = 0; i < fire; i++) // 统计火把 { int x0, y0; scanf("%d%d", &x0, &y0); x0--, y0--; // 我们定义的地图数组下标从 0 开始,题目从 1 开始,所以要把题目的输入减 1 for (int dx = 0; dx <= 2; dx++) { for (int dy = 0; dy <= 2 - dx; dy++) { if (x0 - dx >= 0 && x0 - dx < n && y0 - dy >= 0 && y0 - dy < n) // 判定越界 monster[x0 - dx][y0 - dy] = false; if (x0 + dx >= 0 && x0 + dx < n && y0 - dy >= 0 && y0 - dy < n) // 判定越界 monster[x0 + dx][y0 - dy] = false; if (x0 - dx >= 0 && x0 - dx < n && y0 + dy >= 0 && y0 + dy < n) // 判定越界 monster[x0 - dx][y0 + dy] = false; if (x0 + dx >= 0 && x0 + dx < n && y0 + dy >= 0 && y0 + dy < n) // 判定越界 monster[x0 + dx][y0 + dy] = false; } } }
for (int i = 0; i < stone; i++) // 统计萤石 { int x0, y0; scanf("%d%d", &x0, &y0); x0--, y0--; for (int x = x0 - 2; x <= x0 + 2; x++) { if (x < 0 || x >= n) // 判定越界 continue; for (int y = y0 - 2; y <= y0 + 2; y++) { if (y < 0 || y >= n) continue; monster[x][y] = false; } } }
int ans = 0; // 统计怪物总数 for (int x = 0; x < n; x++) for (int y = 0; y < n; y++) if (monster[x][y]) ans++;
printf("%d", ans); }
注意到 21 行至 28 行都是结构重复的代码,只是处理的变量有点不同。因此我们可以把重复的一个小过程独立为函数(但这是下周的内容,所以不做要求)。同时我们还需要将 monster[][] 和 n 的定义放到 main 函数以外(相关知识:函数作用域)。
题外话,如果不想把 monster 和 n 的定义放到 main 外呢?可以把这两个作为函数的参数(但是二维数组一般不推荐作为函数参数),或者使用 lambda 表达式在 main 函数内定义我们上面提到的函数。这里涉及的知识又有不少了,甚至 lambda 表达式超出了 C 语言的范围,因此我们略过,有兴趣的同学可以自己了解。
deflighten(x: int, y: int): if0 <= x < n and0 <= y < n: monster[x][y] = False
n, fire, stone = map(int, input().split()) monster = [[True] * n for i in range(n)] # 运用列表生成式初始化二维数组
for i in range(fire): # 处理萤火 x0, y0 = map(int, input().split()) x0 -= 1 y0 -= 1 for dx in range(0, 3): for dy in range(0, 3 - dx): lighten(x0-dx, y0-dy) lighten(x0+dx, y0-dy) lighten(x0-dx, y0+dy) lighten(x0+dx, y0+dy)
for i in range(stone): # 处理萤火 x0, y0 = map(int, input().split()) x0 -= 1 y0 -= 1 for dx in range(-2, 3): for dy in range(-2, 3): lighten(x0+dx, y0+dy)
for i := 0; i < n; i++ { for j := 0; j < n; j++ { monster[i][j] = true } }
for i := 0; i < fire; i++ { // 处理火把 var x, y int fmt.Scanln(&x, &y) x-- y-- for dx := 0; dx <= 2; dx++ { for dy := 0; dy <= 2 - dx; dy++ { lighten(x-dx, y-dy) lighten(x+dx, y-dy) lighten(x-dx, y+dy) lighten(x+dx, y+dy) } } }
for i := 0; i < stone; i++ { // 处理萤石 var x, y int fmt.Scanln(&x, &y) x-- y-- for dx := -2; dx <= 2; dx++ { for dy := -2; dy <= 2; dy++ { lighten(x+dx, y+dy) } } }
for i := 0; i < n; i++ { for j := 0; j < n; j++ { if monster[i][j] { ans++ } } } fmt.Println(ans) }