Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ đếm số ô được chiếu sáng bởi nhiều đèn pin

Mô tả bài toán

Cho lưới h×w, vị trí các đèn pin (mảng bulb) và chướng ngại vật (mảng obstacle). Đèn pin chiếu sáng 4 hướng cho đến khi gặp chướng ngại vật. Tính tổng số ô được chiếu sáng (kể cả ô có đèn).

Ví dụ

h=4,w=4, bulb={{1,1},{2,2},{3,3}}, obstacle={{0,0},{2,3}}. Đầu ra: 13.

Thuật toán (Quét 4 hướng đánh dấu)

  1. Tạo mảng grid: 0=trống, 1=đèn, 2=chướng ngại.
  2. Mảng check bool đánh dấu ô được chiếu sáng.
  3. Quét từng hàng trái→phải, phải→trái: biến gd = 1 nếu gặp đèn, 0 nếu gặp chướng ngại. check[i][j] |= gd.
  4. Quét từng cột trên→dưới, dưới→trên tương tự với biến k.
  5. Kết quả = h*w - số ô có check=false.

Đoạn mã C++

#include <bits/stdc++.h>
using namespace std;

int solve(int h, int w,
          vector<pair<int,int>> bulb,
          vector<pair<int,int>> obstacle) {
    vector<vector<int>> grid(h, vector<int>(w,0));
    for(auto [x,y]: bulb) grid[x][y]=1;
    for(auto [x,y]: obstacle) grid[x][y]=2;

    int result = h*w;
    vector<vector<bool>> check(h, vector<bool>(w,false));

    for(int i=0;i=0;j--) {
            if(grid[i][j]==2) gd=0;
            if(grid[i][j]==1) gd=1;
            check[i][j] = check[i][j] | gd;
        }
    }
    for(int j=0;j=0;i--) {
            if(grid[i][j]==2) k=0;
            if(grid[i][j]==1) k=1;
            check[i][j] = check[i][j] | k;
        }
    }
    for(int i=0;i

Đầu vào / Đầu ra

Input: 4, 4, {{1,1},{2,2},{3,3}}, {{0,0},{2,3}}

Output: 13