hiho1273 幾何操作 dfs

2021-07-10 11:53:29 字數 1989 閱讀 2602

學習大牛寫的

題目:小hi實驗室所在的建築一樓有乙個用於貼海報的黑板,不停的有新的海報往上貼,也會安排人員不斷的對海報進行清理,而最近,輪到了小hi去對海報進行清理。

黑板是一塊w*h大小的區域,如果以左下角為直角座標系的話,在上次清理後第i張貼上去的海報可以視作左下角為(x1i, y1i),右上角為(x2i, y2i)的乙個矩形。

撕去一張海報會導致所有覆蓋在其上的海報都被同時撕掉(這樣被稱為連帶,這個過程是具有傳遞性的,即如果a覆蓋b,b覆蓋c,那麼撕掉c會導致a和b均被撕掉),但是一張海報想要被手動撕掉的話需要至少存在乙個角沒有被其他海報覆蓋(海報a被海報b覆蓋當且僅當他們存在面積大於0的交集並且a在b之前貼出,海報a的乙個角被海報b覆蓋當且僅當這個頂點處於海報b的內部)。

於是現在問題來了,為了節約時間,小hi決定一次性撕掉盡可能多的海報,那麼他應該選擇哪張海報呢?在效果相同的情況下,小hi傾向於選擇更早貼出的海報。

每個輸入檔案僅包含單組測試資料。

每組測試資料的第一行為三個正整數w,h和n,分別表示黑板的寬、高以及目前張貼出的海報數量。

接下來的n行,每行為四個正整數x1i、y1i、x2i和y2i,描述第i張貼出的海報。

對於20%的資料,滿足1<=n<=5,1<=w,h<=10

對於100%的資料,滿足1<=n<=1000,0<=x1i, x2i

<= w, 0<=y1i, y2i

<=h, 1<=w,h<=108

對於每組測試資料,輸出兩個正整數ans和k,表示小hi一次最多能撕掉多少張海報,和他選擇的海報是第幾張貼出的。

思路:1、首先需要有乙個函式判斷兩張海報是否覆蓋,a的左下在b的右上的上面顯然不重疊(非嚴格大於),四個角四種對應關係是不覆蓋的,其他都是覆蓋的,將覆蓋的海報建邊,為搜尋打基礎。 

2、需要判斷當前海報是否四個角被覆蓋,因為n是1000,所以暴力也不會超時。依次判斷當前海報的四個角和後面的海報的覆蓋關係。這個判斷就簡單了,看點是否在麵內,不能再線上,必須在麵內。若四個角都被覆蓋顯然不行,用陣列res標記

3、dfs搜尋,維護最大值

ps:最煩幾何了,各種麻煩。不過思路清晰嚴謹一點這道題不難。

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

//#pragma comment(linker, "/stack:102400000,102400000")

#define maxn 1005

#define mod 1000000007

#define mem(a , b) memset(a , b , sizeof(a))

#define ll long long

#define inf 100000000

int w , h , n;

int vis[maxn];

bool res[maxn];

vectorg[maxn];

struct node

a[maxn];

bool judge(int d , int u) //判斷u是否覆蓋d

bool judge2(int root , int x , int y) //判斷某個點是否被覆蓋

int dfs(int root)

return num;

}int main()

for(int i = 0 ; i < n ; i ++)

if(flag == 15) res[i] = 0; //判斷四個角是否被全覆蓋

}int ans = 0, pos = 0;

for(int i = 0 ; i < n ; i ++)

if(ans >= n - i - 1) break;}}

printf("%d %d\n" , ans , pos);

}return 0;

}

計算幾何經典操作

不完整 o o 提供幾種常用操作的模板 這裡寫 片 include include include include using namespace std const double eps 1e 8 const int n 10000 struct node node po n 過載運算子 node...

ORCAL 幾何字段操作

wmmap objectid 自增變數 create sequence wmmap objectid 每次加1 increment by 1 從1開始計數 start with 1 不設定最大值 nomaxvalue 累加,不迴圈 nocycle 設定快取cache個序列 nocache 保證序列連...

OpenCV Python 核心操作 幾何變換

1.幾何變換的實際意義 從線性代數角度來看,在乙個向量 x,y 前面乘以乙個矩陣 其本質上,是將向量 x,y 轉換到 a1,b1 a2,b2 的座標系中,即實現向量 x,y 的位移 2.擴充套件縮放 opencv 提供cv2.resize 圖形檔案,x方向長度,y方向高度 轉換模式 或者 cv2.r...