导航:首页 > 源码编译 > 循环赛日程表算法java

循环赛日程表算法java

发布时间:2023-02-01 01:40:56

‘壹’ 利用分治法设计循环赛日程表的算法

直接上代码吧~~
#include<stdio.h>
void (int n);
void tour(int n);
void make(int n);
void odd(int n);
int a[100][100];
int b[100];
int main()
{
int n,i,j;
printf("Please input n :\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
a[1][i]=i;
a[i][1]=i;
}
tour(n);
if(n % 2 == 1)
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
if(a[i][j] == n +1)
printf(" ");
else
printf("%-4d",a[i][j]);
}
printf("\n");;
}
else
for(i=1;i<=n;i++)
{
for(j=1;j <= n;j++)
{
if(a[i][j] == n +1)
printf(" ");
else
printf("%-4d",a[i][j]);
}
printf("\n");;
}
}
void (int n)
{
int m = n/2;
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
{
a[i][j+m]=a[i][j]+m;
a[i+m][j]=a[i][j+m];
a[i+m][j+m]=a[i][j];
}
}
void tour(int n)
{
if(n==1)
{
a[1][1]=1;
return;
}
if(n%2==1)//奇数
{
tour(n+1);
return;
}
tour(n/2);
make(n);
}
void make(int n)
{
if(n/2>1 && ((n/2)%2))
odd(n);
else
(n);
}
void odd(int n)
{
int i,j;
int m=n/2;
for(i=1;i<=m;i++)
{
b[i]=m+i;
b[m+i]=b[i];
}
for(i=1;i<=m;i++)
{
for(j=1;j<=m+1;j++)
{
if(a[i][j]>m)
{
a[i][j]=b[i];
a[m+i][j]=(b[i]+m)%n;
}
else
{
a[m+i][j]=a[i][j]+m;
}
}
for(j=2;j<=m;j++)
{
a[i][m+j]=b[i+j-1];
a[b[i+j-1]][m+j]=i;
}
}
}

就这个啦,希望能帮到你给分吧~~

‘贰’ (急求!)c语言设计:循环赛日程表

循环赛制不一定是n-1天,亦可能是n天.
例如: 当n=3时, 第一天:0-1 第二天 0-2 而此时,1与2还没有比, 赛事规定: 1必须与2比赛.
/*
当n为偶数时, 分为n/2 和 n/2+1 两组队伍, 它们两组之间完成循环赛事的总时间为 n/2+1天
当n为奇数时, 分为n/2 和 n/2 两组队伍, 它们两组之间完成循环赛事的总时间为 n/2 天
依此来设置打印结果的递归.
*/

void theMatchDay(int nStart/*这一组的起始号码*/,int nTeam/*这一组有多少人*/, int thedayprintf)
{
if(nTeam<=1)
return;
//定义甲乙两组人数. 甲乙组之间比赛天数为nTeamB
int nTeamA = nTeam/2;
int nTeamB = nTeam - nTeamA;

if(thedayprintf>=nTeamB)
{//还要分组进行.
theMatchDay(nStart,nTeamA,thedayprintf-nTeamB);
theMatchDay(nStart+nTeamA,nTeamB,thedayprintf-nTeamB);
}
else
{
for(int i=0;i<nTeamA;i++)
{
printf("%03d-", nStart+i);
int j = i+thedayprintf;
if(j>=nTeamB) j-=nTeamB;
printf("%03d , ", j+nTeamA+nStart);
}
}
}

void printfMatch(int nteam)
{//打印赛事
for(int i=0;i<nteam;i++)
{
printf("TheDay %d : ",i);
theMatchDay(0,nteam,i);
printf("\n");
}
}
void main()
{
printfMatch(3); //亦可以为其它的.
}

‘叁’ 循环赛日程算法的时间复杂度是多少

循环的次数为n*(n-1)/2,所以时间复杂度应该是n^2,即n的平方

‘肆’ 算法理解题 循环赛比赛日程表

题目好像有问题。

当n=23=8时??
应该是:n=2k=8吧!

(1)如果n=2k
循环赛需要进行(n-1)!场比赛。
至少要进行(n-1)天,因为:
①每个选手必须与其他n-1名选手比赛各一次;
②每个选手一天至多只能赛一次;
③循环赛要在最短时间内完成。

(2)当n=2k=8时,循环赛日程表:
第1天:1-2;3-4;5-6;7-8;
第2天:1-3;2-4;5-7;6-8;
第3天:1-4;2-3;5-8;6-7;
第4天:1-5;2-6;3-7;4-8
第5天:1-6;2-7;3-8;4-5;
第6天:1-7;2-8;3-5;4-6;
第7天:1-8;2-5;3-6;4-7;

‘伍’ 数据结构---网球循环赛日程表

#include<stdlib.h>
#include<stdio.h>
int **A; //int *指针数组,
int *schele; //int数组,一维数组保存二维数组的数据
int N =1; //问题的规模。初始化时会设定
//isodd:判断x是否奇数,是则返回1,否则0
int isodd(int x)
{
return x&1;
}
//print:打印赛程
void print()
{
int i,j, row, col;
if(isodd(N))
{
row=N;
col=N+1;
}
else
{
row=N;
col=N;
}
printf("第1列是选手编号\n");
for(i=0;i<row; i++)
{
for(j=0;j<col; j++)
{
printf("%4d", A[i][j]);
}
printf("\n");
}
}
/*init:初始化,设置问题规模N值,分配内存,用schele指向;
把A构造成一个二维数组
*/
void init()
{ int i, n;
char line[100]={'\0'};
printf("请输入选手人数:");
fgets(line,sizeof(line), stdin);
N=atoi(line);
if(N<=0) exit(-1);
if(isodd(N))
n=N+1;
else
n=N;
//schele是行化的二维数组
schele=(int *)calloc(n*n, sizeof(int));
A=(int **)calloc(n, sizeof(int *));
if(!schele || A==NULL) exit(-2);
for(i=0;i<n;i++) //把A等价为二维数组
{
A[i]=schele+i*n;
A[i][0]=i+1;//初始化这个数组的第一列
}
return;
}
/*replaceVirtual:把第m号虚的选手去掉(换做0)*/
void replaceVirtual(int m)
{
int i,j;
for(i=0;i<m-1;i++) //行:对应选手号1~m-1
{
for (j=0;j<=m;j++) //列: 比行要多1
A[i][j] = (A[i][j]==m)?0:A[i][j];
}
return;
}
/*even:m为偶数时用,由前1组的m位选手的安排,来构成第2组m位选手
的赛程安排,以及两组之间的比赛安排 */
void even(int m)
{
if(isodd(m)) return;
int i,j;
for (j=0;j<m;j++) //1. 求第2组的安排(+m)
{
for (i=0;i<m;i++)
{
A[i+m][j]=A[i][j]+m;
}
}
for (j=m;j<2*m;j++)//两组间比赛的安排
{
for (i=0;i<m;i++) //2. 第1组和第2组
{
A[i][j]=A[i+m][j-m]; //把左下角拷贝到右上角
}
for (i=m;i<2*m;i++) //3. 对应的,第2组和第1组
{
A[i][j]=A[i-m][j-m]; //把左上角拷贝到右下角
}
}
return;
}
/*odd:m为奇数时用,由前1组的m位选手的安排,来构成第2组m位选手
的赛程安排,以及两组之间的比赛安排。这时和m为偶数时的
处理有区别。
*/
void odd(int m)
{
int i,j;
for (j=0;j<=m;j++) //1. 求第2组的安排(前m天)
{
for (i=0;i<m;i++)//行
{
if (A[i][j]!=0)
{
A[i+m][j]=A[i][j]+m;
}
else //特殊处理:两个队各有一名选手有空,安排他们比赛
{
A[i+m][j] = i+1;
A[i][j] = i+m+1;
}
}
}
///////////安排两组选手之间的比赛(后m-1天)////////////////////////
for(i=0,j=m+1;j<2*m;j++)
{
A[i][j] = j+1; //2. 1号选手的后m-1天比赛
A[ (A[i][j] -1) ][j] = i+1; //3. 他的对手后m-1天的安排
}
//以下的取值要依赖于1号选手的安排,所以之前先安排1号的赛程
for (i=1;i<m;i++) //第1组的其他选手的后m-1天的安排
{
for (j=m+1;j<2*m;j++)
{//2. 观察得到的规则一:向下m+1~2*m循环递增
A[i][j] = ((A[i-1][j]+1)%m==0)?A[i-1][j]+1 :m + (A[i-1][j]+1)%m;
//3. 对应第2组的对手也要做相应的安排
A[ (A[i][j]-1) ][j] = i+1;
}
}
return;
}
/*make:当前有m位(偶数)选手,分成两组,每组由m/2位选手构成
由第一组的m/2位选手的安排来构成第二组的比赛安排,第一
组与第二组的比赛安排。要区分m/2为奇数和偶数两种情况
*/
void make(int m)
{
if (isodd(m/2)) //m/2为奇数
odd(m/2);
else //m/2为偶数
even(m/2);
}
void tournament(int m)
{
if(m==1)
{
A[0][0]=1;
return ;
}
else if(isodd(m)) //如果m为奇数,则m+1是偶数
{
tournament(m+1); //按照偶数个选手来求解
replaceVirtual(m+1); //然后把第m+1号虚选手置成0
return ;
}
else //m是偶数,
{
tournament(m/2); //则先安排第1组的m/2人比赛
make(m); //然后根据算法,构造左下、右下、右上、右下的矩阵
}
return ;
}

/*endprogram:回收分配的内存*/
void endprogram()
{
free(schele);
free(A);
}
int main()
{
init(); //初始化
tournament(N);//求解
print(); //打印结果
endprogram(); //回收内存
return 0;
}

‘陆’ 求助:循环赛—java源代码

以前的!
====代码====
package com;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
* 网球赛
* @author Cris
* @ClassName: Match
* @Version
* @ModifiedBy
* @Copyright @ 2010 H&L Technology Inc.
* @date 2011-5-24 上午11:29:39
* @description
*/
public class Match implements ActionListener{
private JFrame f;
private JTextField tf;
private JPanel container;
private JList myList ;
private JLabel message;
private JButton b;

/**
* @author Cris
* @title: main
* @date 2011-5-23 上午11:07:27
* @param args void
*/
public static void main(String[] args) {
Match t = new Match();
t.go();
}

public void go(){
f = new JFrame("比赛");
f.setLocation(100, 200);
f.setSize(600,500);

container = new JPanel(new BorderLayout());
f.setContentPane(container);

JPanel title = new JPanel(new FlowLayout());

tf = new JTextField(10);
title.add(tf);

b = new JButton("确定");
b.addActionListener(this);
title.add(b);

message = new JLabel();
title.add(message);

container.add(title,BorderLayout.NORTH);

myList = new JList();
container.add(myList,BorderLayout.CENTER);

f.setVisible(true);
}

/**
* 显示比赛结果
* @author Cris
* @title: show
* @date 2011-5-24 上午11:31:05
* @param n void
*/
private void show(int n){
Cris c = new Cris(n);
List<List<String[]>> result = c.getResult();
String[] str = new String[result.size()];
for (int i = 0; i < result.size(); i++) {
StringBuilder sb = new StringBuilder();
sb.append("第").append(i+1).append("天: ");
List<String[]> matchList = result.get(i);
for(String[] match : matchList){
sb.append("[").append(match[0]).append("-").append(match[1]).append("] ");
}
str[i] = sb.toString();
}
myList.setListData(str);
message.setText("");
f.setVisible(true);
}

/**
* 清空数据
* @author Cris
* @title: clear
* @date 2011-5-24 上午11:30:36 void
*/
private void clear(){
String[] str = {""};
myList.setListData(str);
message.setText("");
}

public void actionPerformed(ActionEvent e) {
clear();
String s = tf.getText();
if (s == null || "".equals(s = s.trim()) ) {
message.setText("请输入一个偶数");
}
try {
int n = Integer.parseInt(s);
if (n <= 0 || n % 2 != 0) {
message.setText("请输入一个偶数");

}else{
show(n);
}

} catch (Exception ex) {
message.setText("请输入一个偶数");
}
f.setVisible(true);
}

}

第二个类:

package com;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class Cris {
/**选手数量*/
private int n ;

/**各个运动员还没进行的比赛 key:球员名称,value:需进行的比赛集合*/
private Map<String, List<String[]>> playerMacth ;

/**球员人名*/
private String[] players ;

/**最终每天的比赛分布集合*/
private List<List<String[]>> result;
/**所有可选的比赛*/
private List<List<String[]>> allMatchData[];

/**每天的比赛*/
List<String[]> dayMatch ;

/**一个随机对象*/
private Random r;

/**当前运算到的天数*/
private int nowDay;

public Cris(int n){
this.n = n;
playerMacth = new HashMap<String, List<String[]>>();;
result = new ArrayList<List<String[]>>();
allMatchData = new LinkedList[n-1];
r = new Random();
init();
go();
}

/**
* 初始化球员
* @author Cris
* @title: init
* @date 2011-5-23 下午04:22:32 void
*/
private void init(){
//定义球员人名,以数字代表,从1开始
players = new String[n];

for (int i = 0; i < players.length; i++) {
//定义球员的名字
players[i] = String.valueOf(i+1);

//存放每个球员要进行的比赛的集合
List<String[]> matchList = new LinkedList<String[]>();

//球员赛事集合
playerMacth.put(players[i], matchList);

//球员集合,不变
// playerListConst.add(players[i]);
}

//定义每个人的比赛
for (int i = 0; i < players.length -1; i++) {
for (int j = i+1; j < players.length ; j++) {
String[] match = {players[i],players[j]};//定义一个比赛
//把此赛事添加到相应球员需比赛集合中
playerMacth.get(players[i]).add(match);
playerMacth.get(players[j]).add(match);
}
}
}

/**
* 随机获得一个当前天数可进行的比赛组合,并把此比赛组合从总集合中移除
* 如果当前天数无比赛,则先获得比赛,再随机
* @author Cris
* @title: getNowDayMatch
* @date 2011-5-24 上午09:48:23
* @return List<String[]>
*/
private List<String[]> getNowDayMatch(){
if (allMatchData[nowDay] == null) {
setAllMatchNowDay();
}

if (! allMatchData[nowDay].isEmpty()) {
int index = r.nextInt(allMatchData[nowDay].size());
List<String[]> list = allMatchData[nowDay].get(index);
allMatchData[nowDay].remove(index);
return list;
}else {
return null;
}
}

/**
* 取消前一天的比赛
* @author Cris
* @title: cancelYesterday
* @date 2011-5-24 上午09:56:12 void
*/
private void cancelYesterday(){
//清空当前天数的可选比赛组合
allMatchData[nowDay] = null ;

//时间恢复到前一天
nowDay--;

//获得前一天的比赛
List<String[]> matchList = result.get(nowDay);

//取消前一天的比赛
result.remove(nowDay);

//恢复每个运动员未进行的比赛
for(String[] match : matchList){
playerMacth.get(match[0]).add(match);
playerMacth.get(match[1]).add(match);
}

}

public void go(){
//循环比赛天数
for ( nowDay = 0; nowDay < n -1; ) {
//1.随机一个比赛
List<String[]> matchList = getNowDayMatch();

//无比赛组合 ,返回上一天 取消上一天的比赛,时间回退到前一天,跳过此次循环
if (matchList == null) {
cancelYesterday();
continue;
}

//3遍历比赛 去除运动员 去除运动员的未进行比赛
for(String[] match : matchList){
playerMacth.get(match[0]).remove(match);
playerMacth.get(match[1]).remove(match);
}

result.add(matchList);

nowDay++;
}
}

/**
* 从1号队员开始,获得当前天数所有可组合的赛事
* @author Cris
* @title: setAllMatchNowDay
* @date 2011-5-24 上午09:42:51 void
*/
private void setAllMatchNowDay(){
allMatchData[nowDay] = new LinkedList<List<String[]>>();

int n = 1;//1号运动员

//此运动员未进行的比赛
List<String[]> matchList = playerMacth.get(String.valueOf(n));

for(String[] match : matchList){
List<String[]> selectedList = new ArrayList<String[]>();
selectedList.add(match);
doDetAllMatchNowDay(n+1, selectedList);
}

}

/**
* 今天比赛的所有组合
* @author Cris
* @title: doDetAllMatchNowDay
* @date 2011-5-24 上午09:46:05
* @param playerNum
* @param selectedList void
*/
private void doDetAllMatchNowDay(int playerNum,List<String[]> selectedList){
//运动员名称
String player = String.valueOf(playerNum);

boolean flag = true;

//判断此运动员是不是已被选过
for(String[] match : selectedList){
if (match[0].equals(player) || match[1].equals(player)) {
flag = false;
break;
}
}

//已被选过
if ( flag == false) {
//最后一个人员
if (playerNum == n) {
allMatchData[nowDay].add(selectedList);
}else{
doDetAllMatchNowDay(playerNum+1, selectedList);
}

return;
}

//此运动员未进行的比赛
List<String[]> matchList = playerMacth.get(player);

//此运动员可选择的比赛
List<String[]> canDoList = new ArrayList<String[]>();

for(String[] match : matchList){
flag = true;
for(String[] selected : selectedList){
if(match[0].equals(player)){
if(match[1].equals(selected[0])){
flag = false;
}else if(match[1].equals(selected[1])){
flag = false;
}
}else{
if(match[0].equals(selected[0])){
flag = false;
}else if(match[0].equals(selected[1])){
flag = false;
}
}
}
if (flag) {
canDoList.add(match);
}
}

//遍历此运动员可选择的比赛
for(String[] match : canDoList){
List<String[]> newList = ArrayList(selectedList);

//记录当前比赛
newList.add(match);

//最后一个人员
if (playerNum == n) {
allMatchData[nowDay].add(newList);
}else{
doDetAllMatchNowDay(playerNum+1, newList);
}

}
}

/**
* 复制集合
* @author Cris
* @title: ArrayList
* @date 2011-5-24 上午09:24:44
* @param list
* @return List<String[]>
*/
private List<String[]> ArrayList(List<String[]> list){
List<String[]> newList = new ArrayList<String[]>();
for(String[] s : list){
newList.add(s);
}
return newList;
}

public List<List<String[]>> getResult() {
return result;
}
}

阅读全文

与循环赛日程表算法java相关的资料

热点内容
哪些网站可以免费看会员 浏览:309
python函数提示 浏览:524
cmd跟踪命令 浏览:266
电影下载免费网站推荐 浏览:364
泰国永恒无删减版 浏览:42
我的世界服务器如何更改地皮地形 浏览:505
山西联通app是什么软件 浏览:355
更新电视剧最快的网站 浏览:134
兄弟训诫文严厉 浏览:608
李楠程序员 浏览:288
山推管家app怎么改密码 浏览:682
贷款结束什么时候解压 浏览:142
18命令方块代码 浏览:938
安卓手机视频怎么传到mac电脑上 浏览:932
马缨花app是什么 浏览:6
python金融分析招聘 浏览:62
可以直接写电影就有免费 浏览:110
北京一卡通app换了手机怎么弄 浏览:155
有程序员小说 浏览:688
点开就能看的网址 浏览:450