算法提高 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. C++11 中值得关注的几大变化(详解)

    源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里. ...

  2. python selenium 常见问题列表

    python selenium webdriver 常见问题FAQ 另一个FAQ: https://code.google.com/p/selenium/wiki/FrequentlyAskedQue ...

  3. FreeSWITCH增加iLBC编码

    1. 安装ilbc库从第三方库里下载指定版本 git clone https://freeswitch.org/stash/scm/sd/libilbc.git ./bootstrap.sh ./co ...

  4. Linux查看文件夹占用空间

    du -sh *   查看当前目录所有文件的各个大小/home/econf>du -sh *427M apache-tomcat-6.0.2016K bin44M boot6.7M filese ...

  5. [转]如何在Windows 10中更改文件夹背景颜色

    ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...

  6. Excel Open Xml中CellStyleXfs,cellStyle,cellXfs之间关系的总结

    最近这几个东东打交道了几天,总算是弄明白了,综合多个帖子,现在总结如下: 在创建stylesheet时,必须创建fonts,Fills,Borders 和cellXfs(CellFormats)四个节 ...

  7. Hibernate 连接访问多个数据库(含访问不同数据库的相同表)(转)

    利用hibernate访问不同数据库中的不同表或不同数据库中的相同表. 本人在开发过程中的解决方案,希望大家交流.一般用myEclipse工具会自动生成Hibernate的相关文件,大致有下面几类: ...

  8. 如何使用好android的可访问性服务(Accessibility Services)

    原文:http://android.eoe.cn/topic/android_sdk * 主题* Manifest声明和权限 可访问性服务声明 可访问性服务配置 AccessibilityServic ...

  9. vim的Tab键

    vim中默认的tab键大约是6个空格(目测)的宽度.如果想修改为4个空格,用以下命令:    shiftwidth=4    softtabstop-4shiftwidth的含义是:回车后需要缩进时, ...

  10. iOS7.0中UILabel高度调整注意事项

    转自:http://blog.csdn.net/k12104/article/details/33731833 http://herkuang.info/blog/2013/12/31/ios7%E4 ...