Java分治法實現日程表
阿新 • • 發佈:2019-02-02
演算法描述:
設有n=2的k次個運動員要進行網球比賽,現在要設計一個滿足一下要求的比賽日程表:
- 每個選手必須要與其他n-1個選手各賽一次
- 每個選手一天只能賽一次
- 迴圈賽一共進行n-1天
程式碼如下:日程表 1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1
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表格輸出,執行截圖如下: