首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

求一超难算法,

2012-01-26 
求一超难算法,高手请进!!!各位高手:(放在javascript版块没有结果,实不得已)比如有两个表格,每个表格的大小

求一超难算法,高手请进!!!
各位高手:(放在javascript版块没有结果,实不得已)

        比如有两个表格,每个表格的大小是12   ×   16   ,即列为12,行为16。这个表格上面会被放上一个一个的div,每个div大小不等,div最小可为1×1,最大可为12×16。两张表格上面可能会有一个div,可能会放满,也可能一个都没有。现在我想把外面的div放置在这张表格的空白位置,想算出这两张表格中能放下这个div的空白位置。
  /*
      所要放置div的大小最小为1×1,最大为12×16。
      两个table左右排列。
  */
规则:
1.   如果两个table一个div都没有,则根据所给div的大小放置在左边的表格空白处。
2.   表格能够放下div的剩余空白位置必须是连续的。
3.   如果有可用的空白位置,最好能和原有的div并列放置或上下放置,即和原来div的边线紧贴着排列。

我现在做的是两个表格之间div的拖动,拖动功能已经实现了。现在想双击表格之外的div自动跑到表格中的空白位置中。

请大家多多帮忙,用java写也可以,不需要牵涉到html或者dom,希望能够给出一个完整的算法程序,感谢不尽!!!!!


[解决办法]
帮顶~
[解决办法]
不懂,抢个板凳先
[解决办法]
这个完全是javascript编程吧
[解决办法]
那个什么百万格?
[解决办法]
晕死了,本来打算做个图形界面演示,才发现自己不会Swing,我就懂点SWT。。。LZ讲究看吧。。

/**
*class AutoFillDivs该类纯粹是为了演示,只有注释//used的代码才与LZ要求有关
*/
import java.io.* ;
import java.util.* ;
public class AutoFillDivs extends javax.swing.JFrame {

Table tLeft = null; //used
Table tRight =null; //used

public AutoFillDivs() {

tLeft = new Table(0,0,12,16) ; //used
tRight = new Table(20,0,12,16) ; //used
}
public static void main(String args[]){

double width ;
double height ;

boolean quitFlag = false ;
String lastLine = " " ;
BufferedReader stdin = null ;
StringBuffer sb = new StringBuffer() ;
AutoFillDivs af = new AutoFillDivs() ;

System.out.println( "请输入要自动添加的div的宽和高,用逗号分开写如: 4,6 \n输入exit来退出.输入list来列举已填充进取的DIV. ");

while (!quitFlag){

try{
stdin = new BufferedReader( new InputStreamReader(System.in));
lastLine = stdin.readLine() ;
}catch (IOException e){
e.printStackTrace();
}

if (lastLine.trim().toLowerCase().equals( "exit ".toLowerCase())) {
quitFlag = true ;
System.out.println( "再见! ");
System.exit(0);
}
if (lastLine.trim().toLowerCase().equals( "list ".toLowerCase())) {
af.listAllDivs();
}

if (lastLine.split( ", ").length==2 && !lastLine.split( ", ")[0].equals( " ") && !lastLine.split( ", ")[1].equals( " ") ){//used
width = Double.parseDouble(lastLine.split( ", ")[0]);//used
height = Double.parseDouble(lastLine.split( ", ")[1]);//used

if (width > 0.0f && height > 0.0f){//used

Div div = new Div(width , height) ;//used

if (af.tLeft.add(div)){//used
System.out.println( "新的div块已被加到左边的Table ");
}else if (af.tRight.add(div)){//used
System.out.println( "新的div块已被加到右边的Table ");


}else{//used
System.out.println( "两个Table都无再容下这个Div了 ");
}
} else{
System.out.println( "请保证两个参数都大于0 ");
}
}else{
System.out.println( "请输入两个参数并用逗号隔开 ");
}
}
}


private void listAllDivs(){

System.out.println( "================================================== ");
System.out.println( "现在正在输出左边的Table ");
Iterator it = tLeft.alDivs.iterator() ;

while (it.hasNext()){
System.out.println(((Div)it.next()).toString());
}

System.out.println( "================================================== ");
System.out.println( "现在正在输出右边的Table ");
it = tRight.alDivs.iterator() ;

while (it.hasNext()){
System.out.println(((Div)it.next()).toString());
}
System.out.println( "================================================== ");
}
}

/**
*Class Div 代表Div ,
*/


public class Div {

double x; //左顶点x
double y; //左顶点y
double width;
double height;
private boolean state ;//判断这个div是否有效如果width或者height有一个小于0就无效

Div (double aX, double aY, double aWidth, double aHeight){
this.x = aX ;
this.y = aY ;
this.width = aWidth ;
this.height = aHeight ;
state = (aWidth <=0 || aHeight <=0) ? false :true ;
}

Div(double aWidth , double aHeight){
this.width = aWidth ;
this.height = aHeight ;
state = (aWidth <=0 || aHeight <=0) ? false :true ;
}

public boolean isValidity(){ //返回有效性
return state ;
}


public boolean contains (Div aDiv) { //判断一个div是否包含另一个div
if (this.contains(aDiv.x ,aDiv.y)
&& (aDiv.width+aDiv.x < this.width + this.x)
&& (aDiv.height+aDiv.y < this.height + this.y) ){
return true ;
}
return false ;
}


private boolean contains (double x, double y) { //判断一个div是否包含一个点
return (x > = this.x) && (y > = this.y) && ((x - this.x) < width) && ((y - this.y) < height);
}

public String toString(){
return "DIV 顶点坐标:( " + x + ", "+y+ ") 宽度: "+width+ " 高度: " + height ;

}

}

/**
*Class Table 代表Table
*/

import java.util.*;

public class Table {

Div theDiv = null; //一个table它的内部区域可以认为是一个div

Table (double aX, double aY, double aWidth, double aHeight){

theDiv = new Div(aX, aY, aWidth, aHeight) ;
alUnused.add(this.theDiv) ; //初始化可使用区
}

List alDivs = new ArrayList() ; //存储这个table到底已经填加了多少div
List alUnused = new ArrayList() ; //存储这个table还有多少个长方形形状Div可供填充


/**
*这个方法是用来测试当前table是否可以把一个div添加进去,这个div只需要初始化
*width和height就可以了。具体实现原理是:从存储的可供填充的div依次与要填充的div进行比较,
*这里需要注意的是,当前仅仅在第一次找到符合条件的DIV区域时就停止了,如果要控制div填充位置
*的优先级,比如优先考虑在左上位置的符合条件的DIV区域,需要把所有符合条件的都挑出来,然后
*比较它们的x,y坐标即可。


*/

public boolean add(Div aDiv){

Iterator it = alUnused.iterator() ;
Div tempDiv = null ;

while (it.hasNext()){
tempDiv = (Div)it.next() ;

//调用辅助方法addUnusedPart来具体判断一个div是不是能够放到另一个div里。
if ( this.addUnusedPart( tempDiv, aDiv ) ){
alDivs.add(aDiv) ; //如果可以,就把新的div存储起来。
alUnused.remove(tempDiv ); //要及时把被用掉div区域从alUnused remove掉
return true ;
}
}
return false ;
}

/**
*这个方法是个辅助方法,具体来判断一个div是不是能够放到另一个div里。如果不是就返回false
*如果是,就把一个大长方形和一个小长方取反后的区域分成三个长方div块,并存alUnused中去。
*每放入一个div就会产生三个新的div区域供以后使用,除非两个div刚好一样
* --------
*|去 | 留|
*|---|---|
*|留 | 留|
*---------
*/
private boolean addUnusedPart(Div unused , Div aDiv){

aDiv.x = unused.x ;
aDiv.y = unused.y ;

Div temp = null;

//首先要确保要比较的div块有效,并且大的包含小的。
if (unused.isValidity() && aDiv.isValidity() && unused.contains(aDiv)){

temp = new Div( aDiv.x +aDiv.width , aDiv.y ,unused.width - aDiv.width , aDiv.height );
if (temp.isValidity()) alUnused.add(temp) ;

temp = new Div( aDiv.x , aDiv.y + aDiv.height ,aDiv.width , unused.height - aDiv.height );
if (temp.isValidity()) alUnused.add(temp) ;

temp = new Div( aDiv.x +aDiv.width , aDiv.y + aDiv.height ,unused.width - aDiv.width , unused.height - aDiv.height );
if (temp.isValidity()) alUnused.add(temp) ;

temp = null ;
return true ;
}

return false ;

}

}
[解决办法]
帮顶吧 实在难想了
[解决办法]
orangemike(纯学习) 4点钟还在写代码,佩服
[解决办法]
不会~~
[解决办法]
帮顶
看看超难算法多难
[解决办法]
顶orangemike(纯学习)
[解决办法]
偶是菜鸟。。顶
[解决办法]
帮顶了
[解决办法]

[解决办法]
不懂!
表格能够放下div的剩余空白位置必须是连续的?
[解决办法]
做一个循环,从表格的一角开始,将你要放的div放上去,看看是不是被原有的div挡了,要是没有,不就是可以放进去了?

热点排行