乙個布局演算法問題解析

2021-07-25 08:59:48 字數 3138 閱讀 2553

已知條件:

寬度已知且有限,高度無限的區域內,有n個方格,已知這些方格的x ,y 座標以及寬度w和高度h,方格不重疊

需求:

在空間內找個乙個位置,可以放的下乙個固定寬高(如4 x 4)的方格,原則:離原點最近且y軸最上

關鍵點:

位置資訊轉化為二維陣列

目標點:每個已知方格的左下角點 a,右下角點 b,和右上角點 c

目標點位置調整:a點依照高度向左平移,b c點按照寬度向上平移

補充點:原點檢測

具體實現思路:

位置資訊轉化為二維陣列 => 目標點獲取  => 目標點位置調整 => 空間檢測 => 最優點獲取,原則:原點最近 && y軸最上

**實現:

/** 

* spotgenerator

* 將該檔案中的 spotgenerator 方法暴露出去以供呼叫

* * 1. 實現思想:位置資訊轉化為二維陣列 => 目標點獲取 => 目標點位置調整 => 空間檢測 => 最優點獲取,原則:原點最近 && y軸最上

* 2. 使用:呼叫spotgenerator(data, column, initialwidth, initialheight) 方法

* 引數:

* 1. data : 型別 array, 現有gird的位置資訊,示例

* 2. column: 型別 number,分割的列數,例如 24

* 3. initialwidth: 型別 number,新新增grid的預設寬度,如 4

* 4. initialheight: 型別 number,新新增grid時預設高度,如 4

* 返回值:

* 最優點的位置座標,型別:object 示例

*///獲取陣列的深度

function getdepth(data)

}//點集填充

function initspotbydata(arr, data) }}

for (var i = 0; i < arr.length; i++)

}return arr;

}//獲取目標點

function gettargetspot(data) );

rightbottom.push();

topright.push()

}return

}//調節目標點的位置

function tunetargetspot(spot, rootarr, initialwidth, initialheight)

break;

case "rightbottom":

for (var i = 0; i < spot[key].length; i++)

break;

case "topright":

for (var i = 0; i < spot[key].length; i++)

break;}}

}//leftbottom的點向左微調,引數 :

function leftbottomtune(spotposition, rootarr, initialheight) ;

}if (find) break;

}return j == 0 ? j : ++j;//調整後的x值

}//rightbottom的點向上微調,引數 :

function rightbottomtune(spotposition, rootarr, initialwidth) ;

}if (find) break;

};return j == 0 ? j : ++j;

}//topright向上調整,引數 :

function toprighttune(spotposition, rootarr, initialwidth) ;

}if (find) break;

};return j == 0 ? j : ++j;//是否是到邊緣

}//檢測是否可以放的下方格 引數 : 返回值true為可以放得下 false為不能放下

function checkroom(spotposition, rootarr, initialwidth, initialheight)

}if (find) break;

}return !find;

}//獲取最終的點的位置

function getfinalspot(spotposition)

//找到最小值的下標

for (var j = 0; j < yarr.length; j++)

}if (indexarr.length == 1) else

//勾股定理取最近的點

for (var k = 0; k < spotarr.length; k++)

for (var p = 0; p < lengtharr.length; p++)

}return spotarr[finalindex];

}}function spotgenerator(data, column, initialwidth, initialheight)

//點集填充

initspotbydata(rootarr, data);

var targetspot = gettargetspot(data);

tunetargetspot(targetspot, rootarr, initialwidth, initialheight);//位置調整

//原點檢測

if (rootarr[0][0] == 0) );

}for (var key in targetspot) }}

var finalspot = getfinalspot(filtertargetspot);

return finalspot;

}//獲取當前滑鼠位置可以容納下的最大方格的尺寸 x:為

function spacecheckbycursor(data,column,x,y)

乙個演算法問題

今天上午上班由於沒什麼事做,就看看書,發現乙個演算法問題,開始看感覺貌似很簡單,但是越想越有意思。1,題目描述 給定乙個十進位制的正整數n,寫下從1開始到n所有出現 1 的個數。例如 n 2 寫下 1 2 出現了乙個1 n 12,寫下1,2,3,4,5,6,7,8,9,10,11,12.這樣1的個數...

c 視窗布局的乙個問題

同事做了乙個msn功能的客戶端工具.在主視窗上有乙個treelist用來顯示聯絡人.每個節點 聯絡人 雙擊時彈出乙個對話方塊,用與和對方互動.可以說這是乙個非常簡單的gui而局 拋開通訊部分 但雙擊節點後彈出的視窗總是自動在後面.當主視窗最大化時用於互動的視窗就看不到了,手動切換非常麻煩.分析 彈出...

揹包問題解析(一) 貪心演算法

一 題目 有n件物品和乙個容量為v的揹包。第i件物品的重量是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。二 解決思路 本題剛開始的解題的時候,想採取貪心演算法來解決,也就是將放入的物品的價效比按照從高到低進行排序,然後優先放優先順序高的,其次優先...