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;
/**

  • 用分治法解决棋盘覆盖问题

  • 在2n*2n棋盘里面有一个坏点

  • 坏点可以在任何位置

  • 用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 =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 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);
    

    }
    }

你可能感兴趣的:(L瓦片)