1. 程式人生 > 其它 >寒假每日一題題解(2.17)畫圖(桶思想,bool變數標記即可)

寒假每日一題題解(2.17)畫圖(桶思想,bool變數標記即可)

技術標籤:每日一題演算法

畫圖(桶思想,bool變數標記即可)

在一個定義了直角座標系的紙上,畫一個 (x1,y1) 到 (x2,y2) 的矩形指將橫座標範圍從 x1 到 x2,縱座標範圍從 y1 到 y2 之間的區域塗上顏色。

下圖給出了一個畫了兩個矩形的例子。

第一個矩形是 (1,1) 到 (4,4),用綠色和紫色表示。

第二個矩形是 (2,3) 到 (6,5),用藍色和紫色表示。

圖中,一共有 15 個單位的面積被塗上顏色,其中紫色部分被塗了兩次,但在計算面積時只計算一次。

在實際的塗色過程中,所有的矩形都塗成統一的顏色,圖中顯示不同顏色僅為說明方便。

p21.png

給出所有要畫的矩形,請問總共有多少個單位的面積被塗上顏色。

輸入格式

輸入的第一行包含一個整數 n,表示要畫的矩形的個數。

接下來 n 行,每行 4 個非負整數,分別表示要畫的矩形的左下角的橫座標與縱座標,以及右上角的橫座標與縱座標。

輸出格式

輸出一個整數,表示有多少個單位的面積被塗上顏色。

資料範圍

1≤n≤100,
0≤橫座標、縱座標 ≤100

輸入樣例:

2
1 1 4 4
2 3 6 5

輸出樣例:

15

題解

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10010;
int n, s[N][2], e[N][2], a,
b, res; bool pos[N][N]; int main(){ cin >> n; for (int i = 0 ; i < n ; i ++ ) { cin >> s[i][0] >> s[i][1] >> e[i][0] >> e[i][1]; a = max(a, e[i][0]), b = max(b, e[i][1]); for (int j = s[i][0] ; j < e[i][0] ; j ++ ){ for (int k =
s[i][1] ; k < e[i][1] ; k ++ ){ pos[j][k] = true; } } } for (int i = 0 ; i <= a ; i ++ ){ for (int j = 0 ; j <= b ; j ++ ){ if (pos[i][j]) res ++ ; } } cout << res; return 0; }
  • 桶思想,bool變數標記即可