前言
日常算法练习记录
题目
有两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛对手名单。规定A不和J比赛, M不和D及E比赛。列出所有可能的比赛名单。
分析
枚举遍历算法。三维数组teamR存放组合情况,遍历所有组合,check检查条件成立则输出。teamR数组结构:
k | teamR[k][0] | teamR[k][1] | teamR[k][2] | teamR[k][3] | teamR[k][4] |
---|---|---|---|---|---|
0 | AJ | BJ | CJ | DJ | EJ |
1 | AK | BK | CK | DK | EK |
2 | AL | BL | CL | DL | EL |
3 | AM | BM | CM | DM | EM |
4 | AN | BN | CN | DN | EN |
截图
代码(java)
package com.hb;
import java.util.HashMap;
import java.util.Map;
public class AlgorithmTest3 {
static char[] team1 = {'A','B','C','D','E'};
static char[] team2 = {'J','K','L','M','N'};
public static String check(char[] t1,char[] t2,char[] t3,char[] t4,char[] t5)
{
String str ="";
if(t4[1]!='M'&&t5[1]!='M')
{
if(t1[1]!='J')
{
Map<Character, Integer> m = new HashMap<Character, Integer>();
m.put(t1[1],1);
m.put(t2[1],1);
m.put(t3[1],1);
m.put(t4[1],1);
m.put(t5[1],1);
for(char c:team2)
if(!m.containsKey(c))return "";
str+=(""+t1[0]+t1[1]+" "+t2[0]+t2[1]+" "+t3[0]+t3[1]+" "+t4[0]+t4[1]+" "+t5[0]+t5[1]+" ");
return str;
}
}
return "";
}
public static void main(String args[])
{
char teamR[][][] = new char[5][5][2];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
teamR[j][i][0] = team1[i];
teamR[j][i][1] = team2[j];
}
}
System.out.println("所有比赛方法数:");
int sum =0;
for(int i1=0;i1<5;i1++)
for(int i2=0;i2<5;i2++)
for(int i3=0;i3<5;i3++)
for(int i4=0;i4<5;i4++)
for(int i5=0;i5<5;i5++)
{
String str="";
if((str=check(teamR[i1][0],teamR[i2][1],teamR[i3][2],teamR[i4][3],teamR[i5][4]))!="")
{
System.out.println(str);
sum++;
}
}
System.out.println("共个"+sum+"比赛方法:");
}
}
本文使用 文章同步助手 同步