試題編號: | 201409-2 |
試題名稱: | 畫圖 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: | 問題描述 在一個定義了直角坐標系的紙上,畫一個(x1,y1)到(x2,y2)的矩形指將橫坐標范圍從x1到x2,縱坐標范圍從y1到y2之間的區域涂上顏色。 下圖給出了一個畫了兩個矩形的例子。第一個矩形是(1,1) 到(4, 4),用綠色和紫色表示。第二個矩形是(2, 3)到(6, 5),用藍色和紫色表示。圖中,一共有15個單位的面積被涂上顏色,其中紫色部分被涂了兩次,但在計算面積時只計算一次。在實際的涂色過程中,所有的矩形都涂成統一的顏色,圖中顯示不同顏色僅為說明方便。![]() |
代碼:
#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){//沒有發生重疊ans++;paint[m][n]=true;}}}}//3.輸出結果 cout<<ans; }return 0;}/*由題目1<=n<=100,0<=橫坐標、縱坐標<=100。可知時間復雜度為100*100+n+n*n*n=n^3 因為 1<=n<=100 所以復雜度為1000,000沒有超過百萬所以不會超過1s的時間限制 */
代碼分析:
這里采用了最笨的辦法,即對于每一個矩形的每一個單位一一進行累加,因此時間復雜度較高。
代碼優化:
可以把總和用公式求出來,然后再根據是否重疊來較少,這樣就減少了++的運算。
參考代碼:
(參考文章地址:http://blog.csdn.net/tigerisland45/article/details/54773758)
for(int i=1; i<=n; i++) { // 輸入數據 cin >> x1 >> y1 >> x2 >> y2; // 累加面積 sum += (x2 - x1) * (y2 - y1); // 標記和去除重疊部分 for(int i=x1; i<x2; i++) for(int j=y1; j<y2; j++) { if(flag[i][j]) sum--; flag[i][j] = true; }新聞熱點
疑難解答