算法提高 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. SharePoint 2013 Step by Step—— How to Upload Multiple Documents in Document Library

    How to Upload Multiple documents in SharePoint 2013,Options to add multiple files in a document libr ...

  2. Unity3D对apk反编译、重编译、重签名

    本文源链接:http://blog.csdn.net/qq393830887/article/details/56025923 工具 Java环境 Apktool(这玩意有些坑爹,不是官网最新的就好, ...

  3. Android后台处理最佳实践(Best Practices for Background Jobs)

    本课将告诉你如何通过后台加载来加速应用启动和降低应用耗电. 后台跑服务 除非你做了特殊指定,否则在应用中的大部分前台操作都是在一个特殊的UI线程里面进行的.这有可能会导致一些问题,因为长时间运行的操作 ...

  4. WGAN (原理解析)

    在GAN的相关研究如火如荼甚至可以说是泛滥的今天,一篇新鲜出炉的arXiv论文<Wasserstein GAN>却在Reddit的Machine Learning频道火了,连Goodfel ...

  5. Keras 2.0版本运行

    Keras 2.0版本运行demo出错: d:\program\python3\lib\site-packages\ipykernel_launcher.py:8: UserWarning: Upda ...

  6. jmeter 签名MD5生成

    请求接口需要同时发送签名,签名定义为: 可以看出签名就是把用户的密码 .用户名 和签名key生成一个md5串就可以了 刚好jmeter 有个md5 生成,生成前需要获取name ,password k ...

  7. unity, shader中获得当前像素深度

    frag shader中直接访问i.pos.z就是深度,不必除以i.pos.w,因为系统已经自动进行过了透视除法且已将i.pos.w置为0.

  8. Talend 显示隐藏控件-thashmap

    默认情况下,thashmap插件是隐藏的,通过如下的方式可以将隐藏的hashmap插件显示出来:

  9. Android开发环境搭建篇详尽的教程实例汇

    原文链接:http://android.eoe.cn/topic/android_sdk 一.android开发环境搭建图文教程整理篇: 1.Android开发环境搭建全程演示(jdk+eclip+a ...

  10. 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念

    注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...