164 超大區域個數問題(座標離散化,壓縮)

2021-07-09 09:54:35 字數 1084 閱讀 2016

區域個數問題,只不過行列都超大,無法在記憶體內搞陣列來做。(下圖來自《挑戰程式競賽》第二版 164頁)

基本的做法就是進行矩陣壓縮,使用座標離散化的方法,對於行列的每個端點,加上做邊的那個,再加上右邊的那個,壓入vector陣列,排序,去除重複的元素,

然後用find方法找到端點的座標,減去陣列初始位址,便可求得壓縮後的實際端點位址。

需要注意的又幾點:

1. 程式中先排序,再使用了unique方法,unique 在陣列中不是正真將重複的資料刪去,只是講重複的元素移到陣列的末尾,比如:

作用);

sort (xs.begin(),xs.end());

xs.erase(unique( xs.begin(), xs.end() ), xs.end());

3. 書中給出的例子並不能體現優勢,所以本人將矩陣擴大,體現優勢,離散化壓縮後優勢體現明顯;

4. 為保持程式的整潔性,並沒有現則dfs(需要迭代),而選擇bfs,保持了程式的完整性與可維護性;

5. bfs的時候轉移的dx與dy書中沒有給出,估計是漏寫了,在下面的程式中本人補全了。

//

// 164_big lake counting.cpp

// changlle

//// created by user on 1/11/16.

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

int w=100,h=100,n=5;

int x1[5]=;

int x2[5]=;

int y1[5]=;

int y2[5]=;

//填充用

bool fld[5*6][5*6];

// 對x1與x2進行座標離散化,並返回離散化之後的寬度

int compress(int *x1, int *x2, int w) }}

}cout<

《挑戰程式設計競賽》164頁 區域個數

問題描述 w h的格仔畫了n條或垂直或水平寬度為1的直線,求出這些格仔被劃分成了多少個4連塊 上 下 左 右連通 輸入格式 第一行包含兩個整數 w和h,表示矩陣的列數和行數 行列編號都從1開始 第二行包含乙個整數n,表示有n條直線。接下來的n行,每行包含四個整數 x1,y1,x2,y2,表示一條直線...

iOS 記憶體的幾大區域

棧區 stack 由編譯器管理 分配釋放 存放函式引數值 區域性變數的值 函式中的基本資料型別 棧區的操作方式類似資料結構中的棧 先進後出 堆區 heap 由程式設計師管理 分配釋放 若程式設計師不釋放,程式結束時可能由系統 os 存放程式設計師new出來的物件。堆的操作方式與資料結構中的堆不同,操...

iOS總結 記憶體的幾大區域

參考 1.棧區 stack 由編譯器自動分配並釋放,存放函式的引數值,區域性變數等.棧是系統資料結構,對應執行緒 進場是唯一的.優點快速高效缺點資料不靈活 先進後出 棧空間分靜態分配和動態分配兩種 靜態分配是編譯器完成的,比如自動變數 auto 的分配 動態分配由alloca函式完成 棧的動態分配無...