国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

201409-2

2019-11-11 06:23:22
字體:
供稿:網(wǎng)友
問題描述

試題編號:201409-2
試題名稱:畫圖
時間限制:1.0s
內(nèi)存限制:256.0MB
問題描述:問題描述  在一個定義了直角坐標(biāo)系的紙上,畫一個(x1,y1)到(x2,y2)的矩形指將橫坐標(biāo)范圍從x1到x2,縱坐標(biāo)范圍從y1到y(tǒng)2之間的區(qū)域涂上顏色。  下圖給出了一個畫了兩個矩形的例子。第一個矩形是(1,1) 到(4, 4),用綠色和紫色表示。第二個矩形是(2, 3)到(6, 5),用藍(lán)色和紫色表示。圖中,一共有15個單位的面積被涂上顏色,其中紫色部分被涂了兩次,但在計算面積時只計算一次。在實(shí)際的涂色過程中,所有的矩形都涂成統(tǒng)一的顏色,圖中顯示不同顏色僅為說明方便。  給出所有要畫的矩形,請問總共有多少個單位的面積被涂上顏色。輸入格式  輸入的第一行包含一個整數(shù)n,表示要畫的矩形的個數(shù)。  接下來n行,每行4個非負(fù)整數(shù),分別表示要畫的矩形的左下角的橫坐標(biāo)與縱坐標(biāo),以及右上角的橫坐標(biāo)與縱坐標(biāo)。輸出格式  輸出一個整數(shù),表示有多少個單位的面積被涂上顏色。樣例輸入21 1 4 42 3 6 5樣例輸出15評測用例規(guī)模與約定  1<=n<=100,0<=橫坐標(biāo)、縱坐標(biāo)<=100。
問題分析:問題的關(guān)鍵是如何把多個矩形的重疊部分去除。多個矩形可能在一個部分產(chǎn)生多次重疊,因此對于每一個一個單位進(jìn)行標(biāo)記其是否被涂刷過并累計。

代碼:

#include <iostream>using namespace std;/* run this PRogram using the console pauser or add your own getch, system("pause") or input loop */bool paint[101][101];//畫布 記錄每一個單位是否被涂刷過  struct Rectangle{int x1,x2,y1,y2;};Rectangle r[101];int n;int ans=0;int main(int argc, char *argv[]) {while(cin>>n){//1.輸入n個矩形 for(int i=0;i<n;i++){cin>>r[i].x1>>r[i].y1>>r[i].x2>>r[i].y2;}//初始化畫布矩陣 for(int i=0;i<101;i++){for(int j=0;j<101;j++){paint[i][j]=false;}} //2. 遍歷并記錄所有矩形 for(int i=0;i<n;i++){//累加每一個矩形的面積  重疊部分只加一次for(int m=r[i].x1;m<r[i].x2;m++){for(int n=r[i].y1;n<r[i].y2;n++){if(paint[m][n] == false){//沒有發(fā)生重疊ans++;paint[m][n]=true;}}}}//3.輸出結(jié)果 cout<<ans; }return 0;}/*由題目1<=n<=100,0<=橫坐標(biāo)、縱坐標(biāo)<=100。可知時間復(fù)雜度為100*100+n+n*n*n=n^3 因?yàn)?1<=n<=100 所以復(fù)雜度為1000,000沒有超過百萬所以不會超過1s的時間限制 */

代碼分析:

這里采用了最笨的辦法,即對于每一個矩形的每一個單位一一進(jìn)行累加,因此時間復(fù)雜度較高。

代碼優(yōu)化:

可以把總和用公式求出來,然后再根據(jù)是否重疊來較少,這樣就減少了++的運(yùn)算。

參考代碼:  

     (參考文章地址:http://blog.csdn.net/tigerisland45/article/details/54773758)

 for(int i=1; i<=n; i++) {          // 輸入數(shù)據(jù)          cin >> x1 >> y1 >> x2 >> y2;            // 累加面積          sum += (x2 - x1) * (y2 - y1);            // 標(biāo)記和去除重疊部分          for(int i=x1; i<x2; i++)              for(int j=y1; j<y2; j++) {                  if(flag[i][j])                      sum--;                  flag[i][j] = true;              }   


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 繁峙县| 临夏市| 平江县| 晋中市| 深水埗区| 兴文县| 荆州市| 同仁县| 肃宁县| 宜章县| 东海县| 睢宁县| 喀喇沁旗| 北安市| 察哈| 泽库县| 南昌市| 晋城| 色达县| 定远县| 北流市| 峡江县| 临泽县| 安吉县| 黑水县| 河北区| 肇东市| 调兵山市| 凤凰县| 潞西市| 罗城| 贞丰县| 邵阳县| 莱西市| 舒兰市| 红原县| 吉木萨尔县| 屯昌县| 岑溪市| 岳阳县| 海安县|