文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/算法
某項目中要求對網格圖層進行配色,而且全部相鄰網格使用不一樣顏色。由於該網格圖層有上千個要素,若是人工配色一定是一個耗時的過程,並且網格要素的範圍等均有可能發生變化。爲解決該問題,咱們有必要開發一款知足配色要求的配圖工具。那麼,完成該需求須要多少種顏色來進行配圖呢?理論上,四個顏色便可。下面咱們簡單介紹一下數學中一個著名的問題「四色定理」。數組
四色問題又稱四色猜測、四色定理,是世界近代三大數學難題之一。地圖四色定理(Four color theorem)最早是由一位叫古德里(Francis Guthrie)的英國大學生提出來的。微信
四色問題的內容是「任何一張地圖只用四種顏色就能使具備共同邊界的國家着上不一樣的顏色。」也就是說在不引發混淆的狀況下一張地圖只需四種顏色來標記就行。工具
用數學語言表示即「將平面任意地細分爲不相重疊的區域,每個區域總能夠用1234這四個數字之一來標記而不會使相鄰的兩個區域獲得相同的數字。」這裏所指的相鄰區域是指有一整段邊界是公共的。若是兩個區域只相遇於一點或有限多點就不叫相鄰的。由於用相同的顏色給它們着色不會引發混淆。spa
咱們並非要證實四個顏色就能夠知足需求(咱們確定沒這個能力,不然還寫啥代碼),咱們假定這個定理是成立的,進而設計賦色算法。設計
a.定義賦色值爲0、一、二、3,colornums總數爲4。blog
b.得到圖層要素個數爲m,建立大小爲m*m的二維數組,遍歷該要素的同時判斷某一要素與哪些要素相鄰,對相鄰要素在數組中作記錄。好比i和j相鄰,則[i][j]和[j][i]均爲1,不然爲0。ci
c.假定此時要判斷編號爲i的要素賦色。從color=0遍歷到colornums,經過判斷相鄰要素是否已經被賦予顏色,若是沒有則給該color,不然color+1直到合適爲止。開發
如下爲代碼爲zch同窗完成:rem
以上的四色定理,針對是無飛地的網格,可是現實中,網格是每每存在飛地的。幾塊地,他們雖然不相鄰,可是都屬於一個地區,那麼這幾塊地都應該給相同的顏色。
針對這個問題,咱們並不能將colornums固定爲4個,能夠動態對其進行個數延伸以解決該實際問題。
如下是擴展賦色數目後的示例數據截圖:
若是需求中,咱們還需加上一種動態狀態來定義顏色:目前區域內無關鍵人的則爲紅色,其餘有關鍵人的顏色按照以前配色進行,而有無關鍵人是一個動態變化的狀態。
咱們設計以下:
a.給網格表擴展一個字段以存儲原始配色:color
b.給網格表擴展另外一個字段,實時存儲是否有關鍵人存在:has_person,值爲0或1
c.代碼獲取color+hasperson的聯合值,如01或11此類組合。而且代碼將其number化,那麼01依然爲1,11則爲11。
d.配圖中,將color值分別定義好顏色,其餘非color中的值默認均爲紅色。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^