算法提高 3000米排名预测  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  3000米长跑时,围观党们兴高采烈地预测着最后的排名。因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别对自己了解的一些运动员的实力作出了评估,即对部分运动员做了相对排名的预测,并且告诉了可怜留守的班长。因为无聊,于是他们就组团去打Dota去了。比赛结束后他们向班长询问最后的排名,但班长不记得了,只记得他们中哪些人的预测是正确的,哪些人的预测是错误的。他们想知道比赛的排名可能是什么。
输入格式
  第一行两个整数n, m,n为运动员数量,m为围观党数量。运动员编号从0到n-1。
  接下来m行,每行为一个围观党的相对排名预测。每行第一个数c表示他预测的人数,后面跟着c个0~n-1的不同的数,表示他预测的运动员相对排名,最后还有一个数,0表示这个预测是错误的,1表示是正确的。
输出格式
  第一行一个数k为有多少种排名的可能。
  下面k行,每行一个0~n-1的排列,为某一个可能的排名,相邻的数间用空格隔开。所有排名按字典序依次输出。
样例输入
Input Sample 1:
3 2
2 0 1 1
2 1 2 0

Input Sample 2:
3 2
2 0 1 1
2 2 1 0

样例输出
Output Sample 1:
2
0 2 1
2 0 1

Output Sample 2:
1
0 1 2

数据规模和约定
  1<=n<=10, 2<=c<=n, 1<=m<=10,保证数据合法,且答案中排名可能数不超过20000。对于一个排名序列,一个预测是正确的,当且仅当预测的排名的相对顺序是排名序列的一个子序列。一个预测是错误的,当且仅当这个预测不正确。
 
作者注释:认真看了下DFS,搜索时回溯递归总结如下:
 void dfs(当前状态){
if(当前状态为边界状态){
记录或输出
return;
}
for(i=;i<n;i++){//横向遍历解答树所有子节点
修改全局变量,扩展出一个子状态;
if(子状态满足约束条件){
dfs(子状态);
}
恢复全局变量;//回溯部分
}
}

本题代码如下:

 /*
数据规模和约定:1<=n<=10, 2<=c<=n, 1<=m<=10
*/
#include<stdio.h>
#include<string.h>
int n,m;//n表运动员数量;m表预测数据组数
bool use[];//标记节点是否被选用
int str[][]={};
int flag[];
int map[][];
int k;//表满足预测的有多少种可能排名
int judgedfs(){
int x1=,x2=;
for(int i=;i<m;i++){
//表该组预测数据是对的
if(str[i][str[i][]+]== && x1){
int j=;//从每组数据的第二个元素开始遍历
//&&为了确保遍历深度; x<n表没有预测所有运动员的排名
for(int x=; j<=str[i][] && x<n; x++){
if(str[i][j]==flag[x]){
j++;
}
}
if(j<str[i][]+){//表该组数据遍历完成
x1=;
}
}else{//表该组预测数据是错的
int j=;
for(int x=; j<=str[i][] && x<n; x++){
if(str[i][j]==flag[x]){
j++;
}
}
if(j==str[i][]+){
x2=;
}
}
if(!x1 || !x2)//遍历完一组预测数据跳出循环
break;
}
//均为真返回真,否则返回假
if(x1 && x2)
return ;
else
return ;
}
void dfs(int begin){
if(begin==n && judgedfs()){//递归出口:已经搜索到最后一个运动员
for(int i=;i<n;i++){
map[k][i]=flag[i];//记录下将当前遍历到的运动员
}
k++;//可能的情况+1
}
if(begin<n){//执行递归搜索的条件
for(int i=;i<n;i++){
if(use[i]){//若为true,即未被选用
flag[begin]=i;//当前遍历位置记录下运动员的下标
use[i]=false;//此时选用
dfs(begin+);//递归调用,搜索下一个运动员
use[i]=true;//返回初值,或回溯
}
}
}
} int main(){
scanf("%d%d",&n,&m);
getchar();//处理此处的回车
for(int i=;i<m;i++){//m组预测数据
//表此组预测数据预测的人数,后面的循环要用到
scanf("%d",&str[i][]);
//最后一列(即str[i][str[i][0]+1)表此组预测是否正确
for(int j=;j<=str[i][]+;j++){
scanf("%d",&str[i][j]);
}
}
/*
标记当前位置是否已被选用:是:false;否:true;初值均为true.
*/
memset(use,true,sizeof(use));
k=;//对可能的情况置初值
dfs();//从第一个运动员开始搜索
//格式化输出结果
printf("%d\n",k);
for(int i=;i<k;i++){
for(int j=;j<n;j++){
printf("%d ",map[i][j]);
}
printf("\n");
}
return ;
}

C语言 · 3000米排名预测的更多相关文章

  1. Java实现 蓝桥杯VIP 算法提高 3000米排名预测

    算法提高 3000米排名预测 时间限制:1.0s 内存限制:256.0MB 问题描述 3000米长跑时,围观党们兴高采烈地预测着最后的排名.因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别 ...

  2. 蓝桥杯 算法提高 3000米排名预测 DFS 递归搜索 next_permutation()使用

    #include <iostream> #include <algorithm> #include <queue> #include <cstring> ...

  3. kaggle——绝地求生游戏最终排名预测

    绝地求生游戏最终排名预测 知识点 数据读取与预览 数据可视化 构建随机森林预测模型 导入数据并预览 先导入数据并预览.本次实验同样来源于 Kaggle 上的一个竞赛: 绝地求生排名预测 ,由于原始数据 ...

  4. 基于R语言的时间序列分析预测

    数据来源: R语言自带 Nile 数据集(尼罗河流量) 分析工具:R-3.5.0 & Rstudio-1.1.453 #清理环境,加载包 rm(list=ls()) library(forec ...

  5. R语言的ARIMA模型预测

    R通过RODBC连接数据库 stats包中的st函数建立时间序列 funitRoot包中的unitrootTest函数检验单位根 forecast包中的函数进行预测 差分用timeSeries包中di ...

  6. Redhat 5.8系统安装R语言作Arima模型预测

    请见Github博客:http://wuxichen.github.io/Myblog/timeseries/2014/09/02/RJavaonLinux.html

  7. 不知道怎么改的尴尬R语言的ARIMA模型预测

    数据还有很多没弄好,程序还没弄完全好. > read.xlsx("H:/ProjectPaper/论文/1.xlsx","Sheet1") > it ...

  8. 获取技能的成功经验和关于C语言学习的调查 2015528

    内容提要 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 有关C语言学习的调查 你是怎么学习C语言的?(作业,实验,教材,其他 ...

  9. 20155228 获取技能的成功经验和关于C语言学习的调查

    内容提要 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 有关C语言学习的调查 你是怎么学习C语言的?(作业,实验,教材,其他 ...

随机推荐

  1. Html中 <tr> 标签的隐藏与显示

    TR标签的隐藏与显示:block(显示)和none(隐藏) <tr  style="display:none"> <tr id="sample" ...

  2. appium简明教程(4)——appium client的安装

    appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好懂的用例. appium client是配合原生的webdriver来使用的,因此二 ...

  3. Codeforces Round #207 (Div. 1) B. Xenia and Hamming(gcd的运用)

    题目链接: B. Xenia and Hamming 题意: 要求找到复制后的两个字符串中不同样的字符 思路: 子问题: 在两串长度是最大公倍数的情况下, 求出一个串在还有一个串中反复字符的个数 CO ...

  4. python 多进程,实际上都没有运行,sleep

    进程以及状态 1. 进程程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元. 不仅可以通过线程完成多任务,进程也是可以 ...

  5. C#基础第七天-作业答案-利用面向对象的思想去实现名片-动态添加

    class Card { private string name; public string Name { get { return name; } set { name = value; } } ...

  6. php分享十八:网页抓取

    一.抓取远程图片到本地,你会用什么函数? 方法1:利用readfile读取远程图片到缓冲中,然后写入新的文件 function grabImage($url, $filename = '') { if ...

  7. PureFtpd 连接数据库错误

    用Ubuntu一段时间了,作为服务器真是好用,还轻快的很. 作为服务器怎么能没有ftp呢,这里用了pureftpd,没有用vsftpd是因为听大牛说听麻烦,没用过没发言权,不过pureftpd真的挺好 ...

  8. 转:CentOS 6.x 挂载读写NTFS分区(fuse-ntfs-3g)

    from: http://mtd527.blog.163.com/blog/static/222723720151208127898/ 运行环境:CentOS 6.6  x64版本 CentOS不像F ...

  9. C#中对于Enum类型的遍历

    假设有enum类型定义为MyEnumType 则可以这样遍历:  //遍历 枚举类型中的所有成员 foreach (MyEnumType type in Enum.GetValues(typeof(M ...

  10. lua -- 字体闪烁

    -- 这里是实现控件的闪烁,不能将一个局部的动作变量,赋给两个控件来动作,只能一个控件对应一个动作 function UIBagController:ShowEffect( ) local tGood ...