在格子上盖章
有一个 r 行 c 列的格子,开始时所有格都是 0。
第一行给出 r、c 和盖章次数 k,接下来 k 行每行给出 "y x"。
每盖一次章,就把第 y 行第 x 列(都从 1 开始数)的数加 1。
全部盖完后,输出 r 行的格子,每行 c 个数,用一个空格隔开。
- 输入
- 1 ≤ r ≤ 100,1 ≤ c ≤ 100,0 ≤ k ≤ 10,000,1 ≤ y ≤ r,1 ≤ x ≤ c
- 输出
- r 行,每行 c 个数
2 3 3 1 1 2 3 1 1
2 0 0 0 0 1
有一个 r 行 c 列的格子,开始时所有格都是 0。
第一行给出 r、c 和盖章次数 k,接下来 k 行每行给出 "y x"。
每盖一次章,就把第 y 行第 x 列(都从 1 开始数)的数加 1。
全部盖完后,输出 r 行的格子,每行 c 个数,用一个空格隔开。
2 3 3 1 1 2 3 1 1
2 0 0 0 0 1
运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。
$ 就绪
请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。
各语言创建填满 0 的二维列表的方式不同。
Java new int[r][c]、C# new int[r, c] 的格子一开始就是 0。
C 中函数内的数组不保证从 0 开始,要写 int grid[100][100] = {0};。
漏掉的话里面是不确定的值,有时碰巧是 0,看起来像是对的(全局和 static 数组从 0 开始)。
C++ std::vector<std::vector<int>> grid(r, std::vector<int>(c, 0)) 会把内层 vector 分别复制到每一行。
陷阱在 Python 和 JavaScript。
Python [[0] * c] * r 装的是同一行 r 次,盖一格会让该列所有行一起变。
要用 [[0] * c for _ in range(r)] 每行新建。
JavaScript、TypeScript 的 new Array(r).fill(new Array(c).fill(0)) 同样用一个共享数组填满所有行,应写 Array.from({ length: r }, () => new Array(c).fill(0))。
Craykon 的 新列表(r, 新列表(c, 0)) 传入列表时会给每一格分别复制一份,所以各行不会绑在一起。
r, c, k = map(int, input().split())grid = [[0] * c for _ in range(r)] # 줄마다 새 목록for _ in range(k): y, x = map(int, input().split()) grid[y - 1][x - 1] += 1for row in grid: print(*row)const nums = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [r, c, k] = nums;const grid = Array.from({ length: r }, () => new Array(c).fill(0)); // 줄마다 새 배열for (let i = 0; i < k; i++) grid[nums[3 + 2 * i] - 1][nums[4 + 2 * i] - 1]++;console.log(grid.map((row) => row.join(" ")).join("\n"));import { readFileSync } from "node:fs";const nums: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [r, c, k] = nums;const grid: number[][] = Array.from({ length: r }, () => new Array<number>(c).fill(0)); // 줄마다 새 배열for (let i = 0; i < k; i++) grid[nums[3 + 2 * i] - 1][nums[4 + 2 * i] - 1]++;console.log(grid.map((row) => row.join(" ")).join("\n"));import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(in.readLine()); int r = Integer.parseInt(st.nextToken()); int c = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); int[][] grid = new int[r][c]; // 칸은 처음부터 0 for (int i = 0; i < k; i++) { st = new StringTokenizer(in.readLine()); int y = Integer.parseInt(st.nextToken()); int x = Integer.parseInt(st.nextToken()); grid[y - 1][x - 1]++; } StringBuilder out = new StringBuilder(); for (int[] row : grid) { for (int j = 0; j < c; j++) out.append(j > 0 ? " " : "").append(row[j]); out.append('\n'); } System.out.print(out); }}using System;using System.Linq;using System.Text; class Program{ static void Main() { int[] rck = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); int r = rck[0], c = rck[1], k = rck[2]; int[,] grid = new int[r, c]; // 칸은 처음부터 0 for (int i = 0; i < k; i++) { int[] yx = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); grid[yx[0] - 1, yx[1] - 1]++; } var out_ = new StringBuilder(); for (int y = 0; y < r; y++) { for (int x = 0; x < c; x++) out_.Append(x > 0 ? " " : "").Append(grid[y, x]); out_.Append('\n'); } Console.Write(out_); }}#include <iostream>#include <vector> int main() { std::ios::sync_with_stdio(false); int r, c, k, y, x; std::cin >> r >> c >> k; std::vector<std::vector<int>> grid(r, std::vector<int>(c, 0)); // 줄마다 따로 복사된다 for (int i = 0; i < k; i++) { std::cin >> y >> x; grid[y - 1][x - 1]++; } for (const auto& row : grid) { for (int j = 0; j < c; j++) std::cout << (j ? " " : "") << row[j]; std::cout << "\n"; }}#include <stdio.h> int main(void) { int r, c, k, y, x; int grid[100][100] = {0}; /* 함수 안 배열은 = {0} 이 있어야 0으로 시작한다 */ scanf("%d %d %d", &r, &c, &k); for (int i = 0; i < k; i++) { scanf("%d %d", &y, &x); grid[y - 1][x - 1]++; } for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) printf(j ? " %d" : "%d", grid[i][j]); putchar('\n'); } return 0;}rck = 控制台.读数字();r = rck[0];c = rck[1];k = rck[2];// 새목록에 목록을 주면 칸마다 따로 복사해 넣는다grid = 新列表(r, 新列表(c, 0));循环 (i = 0; i < k; i++){ yx = 控制台.读数字(); grid[yx[0] - 1][yx[1] - 1] += 1;}遍历 (row 在 grid){ 控制台.输出(row);}