<!-- 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);
}
}