1. 程式人生 > >Java分治法實現日程表

Java分治法實現日程表

演算法描述:

   設有n=2的k次個運動員要進行網球比賽,現在要設計一個滿足一下要求的比賽日程表:

  1. 每個選手必須要與其他n-1個選手各賽一次
  2. 每個選手一天只能賽一次
  3. 迴圈賽一共進行n-1天  
    日程表
    12345678
    21436587
    34127856
    43218765
    56781234
    65872143
    78563412
    87654321
    程式碼如下:
package keshe;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Form {
    private static int array[][];
	private Container getContent;

    public Form() {
        array = new int[8][8];
        for (int i = 0; i < 8; i++)
            array[i][0] = i + 1;
    }

    public Form(int n) {
        array = new int[n][n];
        for (int i = 0; i < n; i++)
            array[i][0] = i + 1;
    }

    /*
     * a代表待求矩陣行的起始下標,b代表待求矩陣行的終止下標,下同 i代表待求矩陣列的起始下標,j代表待求矩陣列的終止下標,下同
     */
    public void schedule(int a, int b, int i, int j) {
        if (i < j) {
            schedule(a, (int) (a + b - 1) / 2, i, (int) (j + i - 1) / 2);
            schedule((int) (a + b + 1) / 2, b, i, (int) (j + i - 1) / 2);
            merge(a, (int) (a + b - 1) / 2, i, (int) (j + i - 1) / 2, "top");
            merge((int) (a + b + 1) / 2, b, i, (int) (j + i - 1) / 2, "bottom");
        }
    }

    public void merge(int a, int b, int i, int j, String s) {
        int lenth = b - a + 1;
        if (s.equals("top")) {
            for (int p = a; p <= b; p++) {
                for (int q = i; q <= j; q++)
                    array[p + lenth][q + lenth] = array[p][q];
            }
        } else if (s.equals("bottom")) {
            for (int p = a; p <= b; p++) {
                for (int q = i; q <= j; q++)
                    array[p - lenth][q + lenth] = array[p][q];
            }
        }
    }

    private static Container getContentPane() {
		// TODO 自動生成的方法存根
		return null;
	}

	public static void main(String[] args) {
        Form obj = new Form();
        obj.schedule(0, 7, 0, 7);
        String s=JOptionPane.showInputDialog(null,"請輸入選手個數(個數為2的n次方)");
        int n=Integer.parseInt(s);
        String[] columnNames=new String[n];
        for(int w=0;w<columnNames.length;w++) {
        	String ss="第"+(w+1)+"天";
        	columnNames[w]=ss;
        }
        String[][] data =new String[n][n] ;
        JTable table=null;
        JFrame f=new JFrame();
        DefaultTableModel defaultTableModel=null;
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++)
                data[i][j]=String.valueOf(array[i][j]);
       } 
        defaultTableModel=new DefaultTableModel(data,columnNames);
        table=new JTable(defaultTableModel);
        JScrollPane p=new JScrollPane(table);
        Container contentPane=f.getContentPane();
        contentPane.add(p, BorderLayout.CENTER);
        f.setSize(500,500);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
    }
}

最後的輸出用的是Jtable表格輸出,執行截圖如下: