OO的乒乓球练习 = =

问题来自: http://bbs.spoto.net/viewthread.php?tid=15658
引用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 测试文件

  1. import junit.framework.TestCase;
  2. public class TestGame extends TestCase {
  3.     
  4.     public void testPlayer(){
  5.         Player a = new Player("A");
  6.         assertEquals("A",a.getName());
  7.         
  8.         Player x = new Player("X");
  9.         assertTrue(a.playTo(x));
  10.         a.dislikeTo(x);
  11.         assertFalse(a.playTo(x));
  12.     }
  13.     
  14.     public void testTeam(){
  15.         Team first = new Team("甲");
  16.         assertEquals("甲",first.getName());
  17.         assertFalse(first.havePlayers());
  18.         assertEquals(0,first.getPlayerCount());
  19.         
  20.         Player a = new Player("A");
  21.         first.addPlayer(a);
  22.         assertTrue(first.havePlayers());
  23.         assertEquals(1,first.getPlayerCount());
  24.         
  25.         Player b = new Player("B");
  26.         first.addPlayer(b);
  27.         assertEquals(2,first.getPlayerCount());
  28.     }
  29.     
  30.     public void testGame(){
  31.         Team first = new Team("甲");
  32.         Player a = new Player("A");
  33.         first.addPlayer(a);
  34.         Player b = new Player("B");
  35.         first.addPlayer(b);
  36.         Player c = new Player("C");
  37.         first.addPlayer(c);
  38.         
  39.         Team second = new Team("乙");
  40.         Player x = new Player("X");
  41.         second.addPlayer(x);
  42.         Player y = new Player("Y");
  43.         second.addPlayer(y);
  44.         Player z = new Player("Z");
  45.         second.addPlayer(z);
  46.         
  47.         Player d = new Player("D");
  48.         
  49.         a.dislikeTo(x);
  50.         c.dislikeTo(x);
  51.         c.dislikeTo(z);
  52.         PlayList playList = first.playTo(second);
  53.         assertFalse(playList.searchGame(a,x));
  54.         assertFalse(playList.searchGame(a,d));
  55.         assertFalse(playList.searchGame(c,x));
  56.         assertFalse(playList.searchGame(c,z));
  57.         assertTrue(playList.searchGame(b,x));
  58.         assertTrue(playList.searchGame(a,z));
  59.         assertTrue(playList.searchGame(y,c));
  60.     }
  61. }

PingPongGame 入口

  1. public class PingPongGame {
  2.     /**
  3.      * @author linyq.
  4.      */
  5.     public static void main(String[] args) {
  6.         Team first = new Team("甲");
  7.         Player a = new Player("A");
  8.         first.addPlayer(a);
  9.         Player b = new Player("B");
  10.         first.addPlayer(b);
  11.         Player c = new Player("C");
  12.         first.addPlayer(c);
  13.         
  14.         Team second = new Team("乙");
  15.         Player x = new Player("X");
  16.         second.addPlayer(x);
  17.         Player y = new Player("Y");
  18.         second.addPlayer(y);
  19.         Player z = new Player("Z");
  20.         second.addPlayer(z);        
  21.         
  22.         a.dislikeTo(x);
  23.         c.dislikeTo(x);
  24.         c.dislikeTo(z);
  25.         
  26.         first.playTo(second).printList();           
  27.         second.playTo(first).printList();
  28.     }
  29. }

Player 队员类

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Player implements Comparable{
  4.     
  5.     private String playerName ;
  6.     
  7.     private List<Player> displayList = new ArrayList<Player>();
  8.     
  9.     public Player(){
  10.     }
  11.     
  12.     public Player(String playerName){
  13.         this.playerName = playerName;
  14.     }
  15.     
  16.     public boolean playTo(Player player){
  17.         if(this==player)
  18.             return false;
  19.         
  20.         if(displayList.contains(player))
  21.             return false;
  22.         
  23.         return true;
  24.     }
  25.     public String getName() {
  26.         return this.playerName;
  27.     }
  28.     public void dislikeTo(Player player) {
  29.         if(!displayList.contains(player)){
  30.             displayList.add(player);
  31.             player.dislikeTo(this);
  32.         }
  33.     }
  34.     @Override
  35.     public int compareTo(Object obj) {
  36.         return playerName.compareTo(((Player) obj).getName());
  37.     }
  38. }

Team 队伍类

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Team {
  4.     
  5.     private String teamName ;
  6.     private List<Player> playerList = new ArrayList<Player>();
  7.     public Team(){
  8.     }
  9.     
  10.     public Team(String teamName){
  11.         this.teamName = teamName;
  12.     }
  13.     public String getName() {
  14.         return this.teamName;
  15.     }
  16.     public boolean havePlayers() {
  17.         return !playerList.isEmpty();
  18.     }
  19.     public int getPlayerCount() {
  20.         return playerList.size();
  21.     }
  22.     public void addPlayer(Player player) {
  23.         playerList.add(player);
  24.     }
  25.     public PlayList playTo(Team team){      
  26.         PlayList playList = new Hopcroft(this,team).getList();
  27.         return playList;
  28.     }
  29.     public List<Player> getPlayList() {
  30.         return this.playerList;
  31.     }
  32.     
  33. }

PlayList 比赛名单类

  1. import java.util.List;
  2. import java.util.TreeMap;
  3. public class PlayList extends TreeMap<Player,Player>{
  4.     
  5.     private Team first,second;
  6.     
  7.     public PlayList(Team first, Team second) {
  8.         this.first = first;
  9.         this.second = second;
  10.     }
  11.     public void printList() {
  12.         System.out.println("【"+first.getName() + "对战"+ second.getName() + "名单公布】");
  13.         for(Player player:first.getPlayList()){
  14.             if(this.containsKey(player)){
  15.                 System.out.println( player.getName() + " v.s " + this.get(player).getName());
  16.             }
  17.         }
  18.     }
  19.     public boolean searchGame(Player a, Player b) {
  20.         if(this.get(a)==b||this.get(b)==a)
  21.             return true;
  22.         return false;
  23.     }
  24. }

Hopcroft 匈牙利算法类

  1. public class Hopcroft {
  2.     
  3.     private int MAX = 5;
  4.     private boolean[] used = new boolean[MAX];
  5.     
  6.     private int[] link = new int[MAX];
  7.     
  8.     private boolean[][] map = new boolean[MAX][MAX];
  9.     
  10.     private Team first,second;
  11.     
  12.     public Hopcroft(Team first,Team second){
  13.         this.first = first;
  14.         this.second = second;
  15.     }
  16.     
  17.     public PlayList getList(){
  18.         this.createMap();
  19.         this.maxMatch();
  20.         PlayList playList = this.getPlayList();     
  21.         
  22.         return playList;
  23.     }
  24.     
  25.     private PlayList getPlayList() {
  26.         PlayList playList = new PlayList(first,second);
  27.         for(int i=0;i<second.getPlayList().size();i++){
  28.             playList.put(first.getPlayList().get(link[i]), second.getPlayList().get(i));
  29.         }
  30.         return playList;
  31.     }
  32.     private void createMap(){
  33.         int i=0;
  34.         for(Player a: first.getPlayList()){
  35.             int j=0;
  36.             for(Player b: second.getPlayList()){
  37.                 if(a.playTo(b)&&b.playTo(a))
  38.                     map[i][j]=true;
  39.                 else
  40.                     map[i][j]=false;
  41.                 j++;
  42.             }
  43.             i++;
  44.         }
  45.     }
  46.     
  47.     private boolean checkMap(int t){
  48.         for(int i=0;i<second.getPlayerCount();i++)
  49.             if(!used[i]&&map[t][i]){
  50.                 used[i]=true;
  51.                 if(link[i]==0||checkMap(link[i])){
  52.                     link[i]=t;
  53.                     return true;
  54.                 }
  55.             }
  56.         return false;
  57.     }
  58.     
  59.     private void maxMatch(){
  60.         for(int i = first.getPlayerCount()-1 ; i>=0;i--){
  61.             for(int j=0;j<second.getPlayerCount();j++)used[j]=false;
  62.             checkMap(i);
  63.         }
  64.     }
  65. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值