比赛安排

时间限制: 1 Sec  内存限制: 125 MB
提交: 11  解决: 10
[提交][状态][讨论版][命题人:外部导入]

题目描述

设有2n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n – 1天内每个队都与不同的对手比赛。

例如n=2时的比赛安排:

队           1  2                  3  4

比赛       1==2               3==4                一天

1==3               2==4                二天

1==4               2==3                三天

输入

每个测试文件只包含一组测试数据,每组输入数据为一个正整数n(n<=6)。

输出

对于每组输入数据,输出比赛安排,从第一天的安排开始,每天占一行,每行开头先输出天号,再输出当天的安排,优先给队伍编号小的队伍安排比赛,具体格式见样例输出。

样例输入

2

样例输出

<1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3

提示

题解:因为n最大为6,那么意味着最多有64只队伍,数据不大。

想到可以穷举。看题面,要从小到大输出。

可以先试试在纸上来写,拿n=3为例,即有8只队伍比赛7天

先看第一天1可以和2,3可以和4,5可以和6,7可以和8

第二天1已经和2比赛过了,所以安排1和3,再接着看2,往后遍历,因为3已经安排和1比赛了,所以2只能和4,5的情况和仿照1的情况所以5-7,6-8。

因此穷举的过程可以得到了,第一重循环跑2^n-1天,第二重循环从小到大跑队伍,第三重循环跑当前队伍的对手,全局上需要开一个二维数组记录哪两个队伍已经比赛过了,在每一天里面,需要开一个一维数组记录在这一天,该队伍是不是已经被安排了。

代码如下:

#include<bits/stdc++.h>

using namespace std;

int main()

{

    int n;   

    while(cin>>n)

    {

        int da=pow(2.0,n)-; //代表比赛的天数

        int me=da+;     //代表比赛的队伍数量

        bool dp[][];  //记录哪两只队伍已经比赛过

        bool vis[];    //记录一天里该队伍是否已经有比赛安排了

        memset(dp,,sizeof(dp)); //初始化为0

        for(int i=;i<=da;i++)  //循环da天

        {

            int q=;     //控制输出格式的变量

            memset(vis,,sizeof(vis));//每一天的vis数组均需要初始化

            cout<<"<"<<i<<">"; //输出每一天的格式要求

            for(int j=;j<=me;j++)  //从小到大循环遍历每一只队伍

            {

               if(vis[j]==)continue;  //如果第j只队伍已经作为了前面队伍的对手则跳过

               vis[j]=; //开始安排第j只队伍的对手,并标记已经便利过

               for(int k=j+;k<=me;k++) //因为按规律得在“-”左边的队伍一定是小于右边的队伍(即对手)

               {

                   if(vis[k]==&&dp[j][k]==) //如果从小到大找到队伍k,且j队伍与k队伍没有比赛过而且k队伍在1当天还没有安排则安排j与k比赛

                   {

                       dp[j][k]=;   //记录j和k已经比赛过

                       vis[k]=;     //标记k队伍在这一天里已经有比赛安排

                       if(q++)cout<<","; //控制输出个数

                       cout<<j<<"-"<<k;

                       break; //找到一场比赛后 跳出找接下来的比赛。

                   }

               }

            }

            cout<<endl;

        }

    }

    return ;

}

我的dfs代码

#include<iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int n;
int v[];
int vs[][];
int s;
queue<int>q;
int p=; void display()
{
cout<<"<"<<p<<">";p++;
while(!q.empty ())
{
int x=q.front ();q.pop();
int y=q.front ();q.pop();
cout<<x<<"-"<<y;
if(q.empty ()) cout<<endl;
else cout<<",";
}
} void dfs(int k,int m)
{
for(int j=k+;j<=(<<n);j++)
{
if(!v[j]&&!vs[k][j])
{
q.push(k);
q.push(j);
vs[k][j]=;
v[k]=;
v[j]=;
m+=;
if(m==s)
{
memset(v,,sizeof(v));
v[]=;
display();
return;
}
for(int i=;i<=(<<n);i++)
{
if(!v[i])
{
dfs(i,m);
return;
}
}
}
}
} int main()
{
cin>>n;
s=(<<n);
while(!q.empty()) q.pop();
memset(v,,sizeof(v));
memset(vs,,sizeof(vs));
if(n==) cout<<"<"<<<<">"<<<<"-"<<;
else
{
v[]=;
for(int i=;i<=(<<n);i++)
{
if(v[i]==)
{
q.push();
q.push(i);
v[i]=;
for(int j=;j<=(<<n);j++)
{
if(!v[j])
{
dfs(j,);
break;
}
}
}
}
}
return ;
}

比赛安排(穷举法或dfs)的更多相关文章

  1. for循环语句以及迭代法和穷举法

    循环语句: 四要素:初始条件,循环条件,状态改变,循环体 for(初始条件;循环条件;状态改变){ //循环体} 案例1:打印等腰直角三角形和菱形 左上三角 static void Main(stri ...

  2. C#4 for循环 迭代法 穷举法应用

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...

  3. C# for 循环 迭代法 穷举法

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...

  4. 【2-24】for循环嵌套,跳转语句,异常语句,穷举法、迭代法

    For循环嵌套与if嵌套相似,是在for中再套for,其结构如下: For(;;) { For(;;){} }经典题型为打印星星例: Console.Write("请输入一个奇数:" ...

  5. 穷举法、for循环、函数、作用域、斐波那契数

    1.穷举法 枚举所有可能性,直到得到正确的答案或者尝试完所有值. 穷举法经常是解决问题的最实用的方法,它实现起来热别容易,并且易于理解. 2.for循环 for语句一般形式如下: for variab ...

  6. C# 异常语句 跳转语句 while循环 穷举法 迭代法

    一  异常语句   ♦ try.....catch....finally 结构形式 try{ 可能会出错的代码语句 如果这里出错了,那么不会在继续下面的代码,而是直接进入catch中处理异常}catc ...

  7. python 穷举法 算24点(史上最简短代码)

    本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...

  8. 基本算法思想之穷举法(C++语言描述)

    穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...

  9. HDU 1017 A Mathematical Curiosity【看懂题意+穷举法】

    //2014.10.17    01:19 //题意: //先输入一个数N,然后分块输入,每块输入每次2个数,n,m,直到n,m同一时候为零时  //结束,当a和b满足题目要求时那么这对a和b就是一组 ...

随机推荐

  1. XP_SP3_专业汉化版__x86_cd_x14-80404

    1.镜像文件: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso 来自 msdn itellyou 2. ...

  2. [转]类不平衡问题与SMOTE过采样算法

    在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...

  3. 云服务器用ssh登录

    本地生成密钥 这里选择在购买前先在本地生成密钥key(分为private key和public key),所以先生成密钥再进行购买,购买完以后直接ssh登录,不需要输入密码(安全性考虑) 其中,pub ...

  4. redis:php-redis中有序集合 zset的使用

    ZSET(stored set) 和 set 一样是字符串的集合,不同的是每个元素都会关联一个 double 类型的 score .实现使用的是 skip list 和 hash table , sk ...

  5. GO学习笔记:函数传值与传指针

    当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上. 为了验证我们上面的说法, ...

  6. Robot Framework(一)

    一. 定义 Robot Framework是一款python编写的功能自动化测试框架,具有良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行 二. Robot ...

  7. 【mysql 】sql删除重复记录 You can't specify target table '表名' for update in FROM clause

    用下面的语句就报语法出错: delete from tab_record where recordid not in (select  min(c.recordid) as recordid from ...

  8. mysql 字段属性 与 排序

    mysql中常见的数据类型:varchar(n).float.int(n).bigint(n).date.datetime.text 字段属性 默认值:DEFAULT '默认值' 非空:NOT NUL ...

  9. 017——VUE中v-fo指令的使用方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 纯css实现Magicline Navigation(下划线动画导航菜单)

    看别人网站的时候,看到一种导航菜单的动画,觉得很有意思,就仔细研究起来. 目前见过的动画有三种:水平下划线动画导航.水平背景动画导航.垂直动画导航,他们实现思路都是一样的,都是依赖 css3的同级通用 ...