左转算法
❶ 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。据此可以作为搜索结果正确与否的判断方式之一。