0
点赞
收藏
分享

微信扫一扫

Java分治法实现日程表


算法描述:

   设有n=2的k次个运动员要进行网球比赛,现在要设计一个满足一下要求的比赛日程表:

  1. 每个选手必须要与其他n-1个选手各赛一次
  2. 每个选手一天只能赛一次
  3. 循环赛一共进行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

  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表格输出,运行截图如下:

Java分治法实现日程表_自动生成

Java分治法实现日程表_自动生成_02

举报

相关推荐

0 条评论