左轉演算法
❶ m個數,得到各種組合,每種組合數大於1,有什麼好演算法。
向左轉|向右轉
其中:m≥n
組合的公式,即在m個數中選出n個數進行組合,組合不分前後順序,而排列就不同,用A表示。
題目說:每種組合數大於1
則,n>1
公式中:!(感嘆號)表示階乘
【舉例:5!=5*4*3*2*1】
❷ java俄羅斯方塊旋轉演算法,求解
可以給每一個小方塊設置為一個坐標,變為一個三階行列式,3*3矩陣,轉變為二元數組旋轉。觀察一下左旋:
11 12 13 31 21 11
21 22 23 →→ 32 22 12
31 32 33 33 23 13
坐標變換如下:(1,1)變為(1,3),(1,2)變為(2,3),(1,3)變為(3,3)
(2,1)變為(1,2),(2,2)變為(2,2),(2,3)變為(3,2)
(3,1)變為(1,1),(3,2)變為(2,1),(3,3)變為(3,1)
規律就是(i,j)變為(j,3-i+1):
如果是2*2的方格,就可以變為二階行列式,也就是2*2的二元數組,這里給出3*3九宮格改變的示意,我的代碼如下:
importjava.util.Random;
publicclassT{
publicstaticvoidmain(String[]args){
int[][]a=newint[3][3];
System.out.println("");
Randomr=newRandom();
for(inti=0;i<3;i++){
for(intj=0;j<3;j++){
a[i][j]=r.nextInt(10);
}
}
System.out.println("thearrayisshownasfollows:");
for(inti=0;i<3;i++){
for(intj=0;j<3;j++){
System.out.print(a[i][j]+"");
}
System.out.println();
}
System.out.println("左轉九十度");
for(inti=0;i<a.length;i++){
for(intj=0;j<a[i].length;j++){
System.out.print(a[a[i].length-1-j][i]+"");
}
System.out.println();
}
}
}
❸ 基於圖論的最小多邊形自動搜索演算法
圖是由點集和邊集所構成的抽象概念,圖的性質實質上可以表現為拓撲關系。如圖4.8b所示,點集由分叉點構成(4個分叉點,分別是1,2,3,4),邊集則由地層線構成(7條地層線,分別是①,②,③,④,⑤,⑥,⑦)。需要說明的是,這里的邊是廣義上的邊,可能是直線段,也可能是多線段。
最小多邊形的自動搜索在GIS的空間分析中應用較多,搜索可分為無拓撲和含拓撲兩類。無拓撲自動搜索則完全依靠幾何計算來判斷,如夾角變化趨勢的多邊形自動搜索演算法(梁曉文等,2005),該演算法主要依靠弧段間夾角計算來判斷,通過「左轉」或「右轉」的方法能夠唯一確定最小多邊形,原理簡單,但程序設計過程極其煩瑣。採用圖論的方法來實現,原理相對復雜,需要掌握數據結構知識,但程序代碼設計過程比較簡潔,具有擴展性。
為了簡單起見,以圖4.8b中地層線①為例,說明搜索過程。從分叉點1開始,沿地層線①在分叉點2與地層線②和③鄰接,地層線②和③又分別在分叉點3和4與兩地層線鄰接。整個鄰接關系可以用一個樹(tree)型結構來表示(圖4.10),終止條件是回到分叉點1,形成閉合迴路或者出現自相交,則停止搜索。這樣,產生4條有意義的多邊形為:1-①-2-②-3-⑥-1,1-①-2-②-3-④-4-⑤-1,1-①-2-③-4-④-3-⑥-1,1-①-2-③-4-⑤-1。
圖4.10 分叉點1沿①為起始方向的連通圖
在上述4條連通多邊形中,面積最小者對應的就是一個最小多邊形(周秋生,1996)。若多邊形點對為(x1,y1),(x2,y2),…,(xn,yn),面積可採用下式來計算:
S=
最終,得到3個最小多邊形。從圖論的觀點來看,所研究的圖是一個連通的平面圖。若圖有n個分叉點,m條廣義邊,p個最小多邊形,則平面圖的面數(包括外部面)f=p+1。
根據歐拉公式(孫家廣,1998):
f+m-n=2 (4.2)
可以得到最小多邊形數目為
p=m-n+1 (4.3)
見圖4.4b中,m=7,n=5,則p=7-5+1=3。據此可以作為搜索結果正確與否的判斷方式之一。