1. 程式人生 > 實用技巧 >洛谷-P2956 [USACO09OCT]The Robot Plow G

洛谷-P2956 [USACO09OCT]The Robot Plow G

洛谷-P2956 [USACO09OCT]The Robot Plow G

原題連結:https://www.luogu.com.cn/problem/P2956


題目描述

Farmer John為了讓自己從無窮無盡的犁田工作中解放出來,於是買了個新機器人幫助他犁田。這個機器人可以完成犁田的任務,可惜有一個小小的缺點:這個犁田機器人一次只能犁一個邊的長度是整數的長方形的田地。

因為FJ的田地有樹和其它障礙物,所以FJ設定機器人去犁很多不同的長方形。這些長方形允許重疊。他給機器人下了P個指令,每個指令包含一個要犁長方形的地。這片田地由長方形的左下角和右上角座標決定。他很好奇最後到底有多少個方格的地被犁過了。

一般來說,田地被分割為很多小方格。這些方格的邊和x軸或y軸平行。田地的寬度為X個方格,高度為Y個方格 (1 <= X <= 240; 1 <= Y <= 240). FJ執行了I (1 <= I <= 200)個指令,每個指令包含4個整數:Xll, Yll, Xur, Yur (1 <= Xll <= Xur; Xll <= Xur <=X; 1 <= Yll <= Yur; Yll <= Yur <= Y), 分別是要犁的長方形的左下角座標和右上角座標。機器人會犁所有的橫座標在Xll..Xur並且縱座標在Yll..Yur範圍內的所有方格的地。可能這個長方形會比你想象的多一行一列(就是說從第Xll列到第Xur列一共有Xur - Xll + 1列而不是Xur - Xll列)。

考慮一個6方格寬4方格高的田地。FJ進行了2個操作(如下),田地就被犁成"*"和"#"了。雖然一般被犁過的地看起來都是一樣的。但是標成"#"可以更清晰地看出最近一次被犁的長方形。

......             **....             #####. 
......  (1,1)(2,4) **....  (1,3)(5,4) #####. 
......             **....             **.... 
......             **....             **.... 

一共14個方格的地被犁過了。

輸入格式

  • 第1行:三個以空格分隔的整數:X,Y和I
  • 第2..I + 1行:第i + 1行包含耕作指令i,該指令由四個整數描述:Xll,Yll,Xur和Yur

輸出格式

  • 第1行:一個整數,代表所耕制的正方形總數

輸入輸出樣例

輸入 #1

6 4 2 
1 1 2 4 
1 3 5 4 

輸出 #1

14 

說明/提示

As in the task's example.

C++程式碼

#include <iostream>
using namespace std;

int a[250][250];

int main() {
    int x, y, t, ans=0;
    cin >> x >> y >> t;
    int xi[t], yi[t], xu[t], yu[t];
    for (int i=0; i<t; ++i)
        cin >> xi[i] >> yi[i] >> xu[i] >> yu[i];
    for (int i=0; i<t; ++i)
        for (int j=xi[i]; j<=xu[i]; ++j)
            for (int k=yi[i]; k<=yu[i]; ++k)
                a[y-k+1][j] = 1;
    for (int i=1; i<=y; ++i)
        for (int j=1; j<=x; ++j)
            if (a[i][j] == 1)
                ++ans;
    cout << ans << endl;
    return 0;
}