问题来自:
http://bbs.spoto.net/viewthread.php?tid=15658
引用chendabian发表于 2008-8-4 22:29:
引用chendabian发表于 2008-8-4 22:29:
【两个乒乓球队进行比赛】
两个乒乓球队进行比赛,各出三人。甲队A,B,C,已队x,y,z,A说他不和x比,C说他不和x,z 比,编程找出三队赛手的名单。 请问这道题 该怎么写???
毫无头绪的乱写……
大略流程是{
创建选手对象a,b,c,x,y,z;
a.不想比(x);c.不想比(z);
创建队伍对象甲,乙;
甲队.加入队员(a,b,c);
乙队.加入队员(x,y,z);
创建比赛列表playList=甲队.比赛与(乙队);
playList.打印();
}
其中创建比赛列表使用了匈牙利算法求最大二分图匹配。= =
因为我不会写全排列{给next_permulation养成的},也不知道该用其他什么方法。
附:代码文件列表
TestGame 测试文件
- import junit.framework.TestCase;
- public class TestGame extends TestCase {
- public void testPlayer(){
- Player a = new Player("A");
- assertEquals("A",a.getName());
- Player x = new Player("X");
- assertTrue(a.playTo(x));
- a.dislikeTo(x);
- assertFalse(a.playTo(x));
- }
- public void testTeam(){
- Team first = new Team("甲");
- assertEquals("甲",first.getName());
- assertFalse(first.havePlayers());
- assertEquals(0,first.getPlayerCount());
- Player a = new Player("A");
- first.addPlayer(a);
- assertTrue(first.havePlayers());
- assertEquals(1,first.getPlayerCount());
- Player b = new Player("B");
- first.addPlayer(b);
- assertEquals(2,first.getPlayerCount());
- }
- public void testGame(){
- Team first = new Team("甲");
- Player a = new Player("A");
- first.addPlayer(a);
- Player b = new Player("B");
- first.addPlayer(b);
- Player c = new Player("C");
- first.addPlayer(c);
- Team second = new Team("乙");
- Player x = new Player("X");
- second.addPlayer(x);
- Player y = new Player("Y");
- second.addPlayer(y);
- Player z = new Player("Z");
- second.addPlayer(z);
- Player d = new Player("D");
- a.dislikeTo(x);
- c.dislikeTo(x);
- c.dislikeTo(z);
- PlayList playList = first.playTo(second);
- assertFalse(playList.searchGame(a,x));
- assertFalse(playList.searchGame(a,d));
- assertFalse(playList.searchGame(c,x));
- assertFalse(playList.searchGame(c,z));
- assertTrue(playList.searchGame(b,x));
- assertTrue(playList.searchGame(a,z));
- assertTrue(playList.searchGame(y,c));
- }
- }
PingPongGame 入口
- public class PingPongGame {
- /**
- * @author linyq.
- */
- public static void main(String[] args) {
- Team first = new Team("甲");
- Player a = new Player("A");
- first.addPlayer(a);
- Player b = new Player("B");
- first.addPlayer(b);
- Player c = new Player("C");
- first.addPlayer(c);
- Team second = new Team("乙");
- Player x = new Player("X");
- second.addPlayer(x);
- Player y = new Player("Y");
- second.addPlayer(y);
- Player z = new Player("Z");
- second.addPlayer(z);
- a.dislikeTo(x);
- c.dislikeTo(x);
- c.dislikeTo(z);
- first.playTo(second).printList();
- second.playTo(first).printList();
- }
- }
Player 队员类
- import java.util.ArrayList;
- import java.util.List;
- public class Player implements Comparable{
- private String playerName ;
- private List<Player> displayList = new ArrayList<Player>();
- public Player(){
- }
- public Player(String playerName){
- this.playerName = playerName;
- }
- public boolean playTo(Player player){
- if(this==player)
- return false;
- if(displayList.contains(player))
- return false;
- return true;
- }
- public String getName() {
- return this.playerName;
- }
- public void dislikeTo(Player player) {
- if(!displayList.contains(player)){
- displayList.add(player);
- player.dislikeTo(this);
- }
- }
- @Override
- public int compareTo(Object obj) {
- return playerName.compareTo(((Player) obj).getName());
- }
- }
Team 队伍类
- import java.util.ArrayList;
- import java.util.List;
- public class Team {
- private String teamName ;
- private List<Player> playerList = new ArrayList<Player>();
- public Team(){
- }
- public Team(String teamName){
- this.teamName = teamName;
- }
- public String getName() {
- return this.teamName;
- }
- public boolean havePlayers() {
- return !playerList.isEmpty();
- }
- public int getPlayerCount() {
- return playerList.size();
- }
- public void addPlayer(Player player) {
- playerList.add(player);
- }
- public PlayList playTo(Team team){
- PlayList playList = new Hopcroft(this,team).getList();
- return playList;
- }
- public List<Player> getPlayList() {
- return this.playerList;
- }
- }
PlayList 比赛名单类
- import java.util.List;
- import java.util.TreeMap;
- public class PlayList extends TreeMap<Player,Player>{
- private Team first,second;
- public PlayList(Team first, Team second) {
- this.first = first;
- this.second = second;
- }
- public void printList() {
- System.out.println("【"+first.getName() + "对战"+ second.getName() + "名单公布】");
- for(Player player:first.getPlayList()){
- if(this.containsKey(player)){
- System.out.println( player.getName() + " v.s " + this.get(player).getName());
- }
- }
- }
- public boolean searchGame(Player a, Player b) {
- if(this.get(a)==b||this.get(b)==a)
- return true;
- return false;
- }
- }
Hopcroft 匈牙利算法类
- public class Hopcroft {
- private int MAX = 5;
- private boolean[] used = new boolean[MAX];
- private int[] link = new int[MAX];
- private boolean[][] map = new boolean[MAX][MAX];
- private Team first,second;
- public Hopcroft(Team first,Team second){
- this.first = first;
- this.second = second;
- }
- public PlayList getList(){
- this.createMap();
- this.maxMatch();
- PlayList playList = this.getPlayList();
- return playList;
- }
- private PlayList getPlayList() {
- PlayList playList = new PlayList(first,second);
- for(int i=0;i<second.getPlayList().size();i++){
- playList.put(first.getPlayList().get(link[i]), second.getPlayList().get(i));
- }
- return playList;
- }
- private void createMap(){
- int i=0;
- for(Player a: first.getPlayList()){
- int j=0;
- for(Player b: second.getPlayList()){
- if(a.playTo(b)&&b.playTo(a))
- map[i][j]=true;
- else
- map[i][j]=false;
- j++;
- }
- i++;
- }
- }
- private boolean checkMap(int t){
- for(int i=0;i<second.getPlayerCount();i++)
- if(!used[i]&&map[t][i]){
- used[i]=true;
- if(link[i]==0||checkMap(link[i])){
- link[i]=t;
- return true;
- }
- }
- return false;
- }
- private void maxMatch(){
- for(int i = first.getPlayerCount()-1 ; i>=0;i--){
- for(int j=0;j<second.getPlayerCount();j++)used[j]=false;
- checkMap(i);
- }
- }
- }