根据输入的球队数量,写一个球队比赛的算法!大神看过来!

香蕉你个巴拉拉 2015-04-03 06:16:15
最近接了个活,需求是根据输入的球队数量来列出比赛对阵情况。要求后台写出代码传到前台!
例如输入了8
第一轮 1-8 2-7 3-6 4-5
第二轮 1-7 2-6 3-5 4-8
第三轮 1-6 2-5 3-4 5-8
第四轮 1-5 2-4 3-8 6-7
第五轮 1-4 2-3 5-6 7-8
第六轮 1-3 2-8 4-6 5-7
第七轮 1-2 3-7 4-
...全文
445 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿亮 2017-03-10
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
static void BeiGeer()
        {
            int n, m;
            n = 8;
            if (n % 2 == 0) { m = n; }
            else { m = n + 1; }
            int a = 1, b = 1, index = 1, loop = 0;
            for (int i = 1; i <= (m - 1) * (m / 2); i++)
            {
                if (a >= m) a = 1;
                if (index > m / 2) index = 1;
                if (index == 1)
                {
                    loop++;
                    if (i == 1)
                    {
                        b = m;
                    }
                    else
                    {
                        b = a;
                    }
                    Console.WriteLine("第" + loop + "轮");
                    if (((i - 1) / (m / 2) % 2) == 0)
                    {
                        Console.WriteLine(a + "----" + m);
                    }
                    else
                    {
                        Console.WriteLine(m + "---" + a);
                    }
                }
                else if (index > 1 && index <= m / 2)
                {
                    if (b > 1) b--;
                    else b = m - 1;
                    Console.WriteLine(a + "---" + b);
                }
                index++;
                a++;
            }
        }
完全不懂……找了个java的改成了c#的
完全正确。 碰到奇数的时候,与不存在的队伍比赛的就算轮空。
  • 打赏
  • 举报
回复
昨天忘记结贴了!@娃都会打酱油了 方法都可以出来!蛮不错的!
  • 打赏
  • 举报
回复
引用 12 楼 starfd 的回复:
static void BeiGeer()
        {
            int n, m;
            n = 16;
            if (n % 2 == 0) { m = n; }
            else { m = n + 1; }
            int a = 1, b = 1, index = 1, loop = 0;
            for (int i = 1; i <= (m - 1) * (m / 2); i++)
            {
                if (a >= m) a = 1;
                if (index > m / 2) index = 1;
                if (index == 1)
                {
                    loop++;
                    if (i == 1)
                    {
                        b = m;
                    }
                    else
                    {
                        b = a;
                    }
                    Console.WriteLine();
                    Console.WriteLine("第" + loop + "轮");
                    
                    if (((i - 1) / (m / 2) % 2) == 0)
                    {
                        Console.Write(a + "----" + m + " ");
                    }
                    else
                    {
                        Console.Write(m + "---" + a + " ");
                    }
                }
                else if (index > 1 && index <= m / 2)
                {
                    if (b > 1) b--;
                    else b = m - 1;
                    Console.Write(a + "---" + b + " ");
                }
                index++;
                a++;
            }
        }
感觉这个不对,输出的看起来像,但跟你们的不一样
单循环和双循环我都出来了,就是类似世界杯那种分组不会写!
  • 打赏
  • 举报
回复
static void BeiGeer()
        {
            int n, m;
            n = 16;
            if (n % 2 == 0) { m = n; }
            else { m = n + 1; }
            int a = 1, b = 1, index = 1, loop = 0;
            for (int i = 1; i <= (m - 1) * (m / 2); i++)
            {
                if (a >= m) a = 1;
                if (index > m / 2) index = 1;
                if (index == 1)
                {
                    loop++;
                    if (i == 1)
                    {
                        b = m;
                    }
                    else
                    {
                        b = a;
                    }
                    Console.WriteLine();
                    Console.WriteLine("第" + loop + "轮");
                    
                    if (((i - 1) / (m / 2) % 2) == 0)
                    {
                        Console.Write(a + "----" + m + " ");
                    }
                    else
                    {
                        Console.Write(m + "---" + a + " ");
                    }
                }
                else if (index > 1 && index <= m / 2)
                {
                    if (b > 1) b--;
                    else b = m - 1;
                    Console.Write(a + "---" + b + " ");
                }
                index++;
                a++;
            }
        }
感觉这个不对,输出的看起来像,但跟你们的不一样
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
什么叫双循环怎么输出?
分组那个怎么弄,没头绪啊。16个队分四组,还得有种子队!
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
先给出结果
第1轮 1 ---- 8  2 ---- 7  3 ---- 6  4 ---- 5
第2轮 1 ---- 7  8 ---- 6  2 ---- 5  3 ---- 4
第3轮 1 ---- 6  7 ---- 5  8 ---- 4  2 ---- 3
第4轮 1 ---- 5  6 ---- 4  7 ---- 3  8 ---- 2
第5轮 1 ---- 4  5 ---- 3  6 ---- 2  7 ---- 8
第6轮 1 ---- 3  4 ---- 2  5 ---- 8  6 ---- 7
第7轮 1 ---- 2  3 ---- 8  4 ---- 7  5 ---- 6

代码发上来
xuzuning 2015-04-07
  • 打赏
  • 举报
回复
先给出结果
第1轮 1 ---- 8  2 ---- 7  3 ---- 6  4 ---- 5
第2轮 1 ---- 7  8 ---- 6  2 ---- 5  3 ---- 4
第3轮 1 ---- 6  7 ---- 5  8 ---- 4  2 ---- 3
第4轮 1 ---- 5  6 ---- 4  7 ---- 3  8 ---- 2
第5轮 1 ---- 4  5 ---- 3  6 ---- 2  7 ---- 8
第6轮 1 ---- 3  4 ---- 2  5 ---- 8  6 ---- 7
第7轮 1 ---- 2  3 ---- 8  4 ---- 7  5 ---- 6

  • 打赏
  • 举报
回复
什么叫双循环怎么输出?
  • 打赏
  • 举报
回复
@娃都会打酱油了 貌似可以,双循环怎么输出呢?
  • 打赏
  • 举报
回复
static void BeiGeer()
        {
            int n, m;
            n = 8;
            if (n % 2 == 0) { m = n; }
            else { m = n + 1; }
            int a = 1, b = 1, index = 1, loop = 0;
            for (int i = 1; i <= (m - 1) * (m / 2); i++)
            {
                if (a >= m) a = 1;
                if (index > m / 2) index = 1;
                if (index == 1)
                {
                    loop++;
                    if (i == 1)
                    {
                        b = m;
                    }
                    else
                    {
                        b = a;
                    }
                    Console.WriteLine("第" + loop + "轮");
                    if (((i - 1) / (m / 2) % 2) == 0)
                    {
                        Console.WriteLine(a + "----" + m);
                    }
                    else
                    {
                        Console.WriteLine(m + "---" + a);
                    }
                }
                else if (index > 1 && index <= m / 2)
                {
                    if (b > 1) b--;
                    else b = m - 1;
                    Console.WriteLine(a + "---" + b);
                }
                index++;
                a++;
            }
        }
完全不懂……找了个java的改成了c#的
  • 打赏
  • 举报
回复
@娃都会打酱油了 真心不会写算法,求帮助写一个算法!
  • 打赏
  • 举报
回复
好复杂好高大上的感觉……
  • 打赏
  • 举报
回复
@xuzuning 没看懂怎么回事啊,8个队我排了半天没排出来!有没有什么代码!
xuzuning 2015-04-03
  • 打赏
  • 举报
回复
关键不是代码,而是算法。 有了算法,代码就简单了 单循环制 参加比赛的各队之间均相互比赛一次,即为单循环赛。 (1)单循环赛的比赛场数计算公式:场数=队数(队数-1)/2 (2)单循环赛的比数轮数计算方法:参赛队为奇数时,比赛轮数等于队数;参赛队为双数时,比赛轮数等于队数减1。 (3)单循环赛的编排方法: ①一般编排方法。采用“逆时针轮转方法”进行编排,先以阿拉伯数字作为代号,代替队名进行编排。把队数按U型走向分成均等两边,如遇单数队,最后一位数字补为O成为偶数。第一轮只要在U形相对队数之间划横线,即为第一轮比赛秩序。第二轮开始固定左上角1数字,其余数字均按逆时针方向移动一个位置,即为第二轮比赛秩序,以后各轮比赛秩序以此类推。遇O队数即轮空队。 例如,有7个队参加比赛,比赛秩序编排如下所示: 第一轮 第二轮 第三轮 第四轮 第五轮 第六轮 第七轮 1—0 1—7 1—6 1—5 1—4 1—3 1—2 2—7 0—6 7—5 6—4 5—3 4—2 3—0 3—6 2—5 0—4 7—3 6—2 5—0 4—7 4—5 3—4 2—3 0—2 7—0 6—7 5—6 采用逆时针轮转法编排的优点,是参赛各队比赛进度一致,编排方法简单,易操作、检查。但当单数队在5个队以上时,抽签为倒数的第二数字队则在第四轮开始每轮均同上轮轮空队进行比赛,如上述的数字6代表的队。由此产生了球类比赛中的不公平竞争现象。为了解决这一问题,目前的比赛大多采用“贝格尔编排方法”。 从1985年起,世界性比赛多采用“贝格”“编排法。其优点是单数队参加时可避免第二轮的轮空队从第四轮起每场都与前一轮的轮空队比赛的不合理现象。   采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边;后一半的数自上而下写在右边,然后用横线把相对的号数连接起来。这即是第一轮的比赛。   第二轮将第一轮右上角的编号(“0”或最大的一个代号数)移到左角上,第三轮又移到右角上,以此类推。   即单数轮次时“0”或最大的一个代号在右上角,双数轮次时则在左上角。如下表示:   7个队比赛的编排方法   第一轮 第二轮 第三轮第四轮第五轮 第六轮第七轮   1-0 0-5 2-0 0-6 3-0 0-7 4-0   2-7 6-4 3-1 7-5 4-2 1-6 5-3   3-6 7-3 4-7 1-4 5-1 2-5 6-2   4-5 1-2 5-6 2-3 6-7 3-4 7-1   无论比赛队是单数还是双数,最后一轮时,必定是“0”或最大的一个代号在右上角,“1”在右下角。   根据参赛队的个数不同,“1”朝逆时针方向移动一个位置时,应按规定的间隔数移动(见表),“0”或最大代号数应先于“1”移动位置。 表2 间隔移动 参赛队数 间隔数 4队以下 0 5~6队 1 7~8队 2 9~10队 3 11~12队 4 “1”进行间隔移动时,凡遇到“0”或最大代号数时应先越过,不作间隔计算   4个队   第一轮 第二轮 第三轮   1----4 4---- 3 2----4   2----3 1---- 2 3----1
  • 打赏
  • 举报
回复
上面没写完,重写一下排列的方法,就是类似这种的,不知道怎么写这算法。求解啊 第一轮 1-8 2-7 3-6 4-5 第二轮 1-7 2-6 3-5 4-8 第三轮 1-6 2-5 3-4 5-8 第四轮 1-5 2-4 3-7 6-8 第五轮 1-4 2-3 5-6 7-8 第六轮 1-3 2-8 4-6 5-7 第七轮 1-2 3-8 4-7 6-7 我已经被搞糊涂了,求大神给出代码!

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧