各位高手:(放在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,希望能够给出一个完整的算法程序,感谢不尽!!!!!

解决方案 »

  1.   

    晕死了,本来打算做个图形界面演示,才发现自己不会Swing,我就懂点SWTLZ讲究看吧。。/**
     *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 ;
            
        }
        
    }
      

  2.   

    orangemike(纯学习) 4点钟还在写代码,佩服
      

  3.   

    其实这个问题,我建议进行简化,一个是div块的大小规格应该是比较固定的几种,至少是在宽的规格上,另外就是div块的规格应该是整数。那么你把table划分成多个1*1的网格,就很好实现了。web页面那么复杂,不说程序怎么写,也给考虑用户的体验。你又不是在写广告栏,看那么多大小不一的框,说实话你就不觉的烦?标准的没进行分析需求。
      

  4.   

    不懂!
    表格能够放下div的剩余空白位置必须是连续的?
      

  5.   

    做一个循环,从表格的一角开始,将你要放的div放上去,看看是不是被原有的div挡了,要是没有,不就是可以放进去了?