Tromino算法分析与设计实验(一)

<!-- lang: js -->

package Tromino; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.util.Scanner; import javax.swing.JFrame; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; /**

  • 用分治法解决棋盘覆盖问题
  • 在2^n*2^n棋盘里面有一个坏点
  • 坏点可以在任何位置
  • 用L型板块覆盖棋盘
  • 解决这个问题的关键在于:分治
  • 分治的关键在于来构造有坏点的棋盘

/ public class Tromino { static int numOfL = 2; /* * @param a 棋盘 * @param x 子棋盘的起始位置 * @param y 子棋盘的起始位置 * @param size 子棋盘的尺寸 * @param bx 子棋盘中单独点的位置 * @param by 子棋盘中单独点的位置 / public static void tromino(Integer[][] a,int x,int y,int size,int bx,int by){ //把一个大图分为4个小图 int nx =x+size/2,ny =y+size/2;//十字中心 int[] bx4 = {nx ,nx-1,nx-1,nx}; int[] by4 = {ny-1,ny-1,ny ,ny};//中间四个点的坐标 if(by<ny&&bx>=nx){ //单独点在第一象限 bx4[0]=bx;by4[0]=by; }else if(by<ny&&bx<nx){//坏点在第二象限 bx4[1]=bx;by4[1]=by; }else if(by>=ny&&bx<nx){//坏点在第三象限 bx4[2]=bx;by4[2]=by; }else{//坏点在第四象限 bx4[3]=bx;by4[3]=by; } //把L形方块图到棋盘中 for(int i=0;i<4;i++){ if(by4[i]==by && bx4[i]==bx)continue; a[by4[i]][bx4[i]]=numOfL; } numOfL++; //分治 递归处理子问题 if(size>2){ tromino(a,nx,y,size/2,bx4[0],by4[0]); tromino(a,x,y,size/2,bx4[1],by4[1]); tromino(a,x,ny,size/2,bx4[2],by4[2]); tromino(a,nx,ny,size/2,bx4[3],by4[3]); } } public static void main(String[] args) { System.out.println("输入棋盘大小2^k提示4,8,16****"); Scanner s=new Scanner(System.in); int size=s.nextInt(); //int size = 8; Integer[][] a=new Integer[size][size]; //int bx=7,by=1;a[by][bx]=1; System.out.println("***起始位置bx"); Scanner x=new Scanner(System.in); int bx=x.nextInt(); System.out.println("***起始位置by"); Scanner y=new Scanner(System.in); int by=y.nextInt(); a[by][bx]=1; System.out.println("输入的起始位置是"+"a["+by+"]"+"["+bx+"]"+"正在绘制L瓦,请稍候……"); tromino(a,0,0,size,bx,by); for(int i=0;i<a.length;i++){ for(int j=0;j<a.length;j++){ System.out.printf("%5d",a[i][j]); } System.out.println(); } draw(a,size); }

private static void draw(Integer[][] a,int size){
    JFrame f = new JFrame("L棋盘");
    
    Integer[] head = new Integer[size];
    for (int i=0;i<head.length;i++) head[i] = i+1;
    final Color[] color =new Color[85];
    for(int i=0;i<color.length;i++){
        float r = (float)(Math.random()); 
        float g =(float)(Math.random());
        float b=(float)(Math.random());
        // int b=(int) ((Math.random()*10000)%255); 
        color[i] = new Color(r,g,b);//红、绿、蓝调色
    }
     
    JTable table = new JTable(a,head);//负责管理表格的外观,构造方法传递参数
    for (int i = 0; i < table.getColumnCount(); i++) { 
            javax.swing.table.TableColumn column = table.getColumn(String.valueOf(i+1));
            column.setCellRenderer(new DefaultTableCellRenderer(){
                @Override
                public Component getTableCellRendererComponent(JTable table,
                        Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
                    int val = (Integer)value;
                    setBackground(color[val-1]);
                    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                            row, column);
                }//返回用于绘制单元格的组件
            });
     }
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//适应新的窗口
    TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();//用来绘制展示当前cell单元数值内容的
    table.setRowHeight(60);//表的行高,测试50小窗口视觉,100大窗口视觉 
    f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);
    f.getContentPane().add(table,BorderLayout.CENTER);
    f.setVisible(true);//可见
    f.setSize(500, 500);
}

}

转载于:https://my.oschina.net/cython/blog/368569

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值