算法提高 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. java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

    原文链接: http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html 代码: http://files.cnblogs.com/k ...

  2. dpkg卸载deb包

    一.背景: 一个脚本安装mysql,结果提示缺少依赖库,安装失败. 二.查询: 此时查询deb文件已经安装的情况,得到这个结果: root@debian:~# dpkg -l |grep mysql- ...

  3. Objective-C 资源收藏

    日志 https://github.com/robbiehanson/CocoaLumberjack 反汇编 otool      nm http://stackoverflow.com/questi ...

  4. List遍历Java 8 Streams map() examples

    1. A List of Strings to Uppercase 1.1 Simple Java example to convert a list of Strings to upper case ...

  5. ElasticSearh更新nested字段(Array数组)。怎么根据查询条件(query)复制一个(index)到新的Index how to update by query a nested fields data for elasticsearch

    GET usernested/_search { "query": { "nested": { "path": "tags&quo ...

  6. linux分享四:cron系统

    cron相关文件: /etc/cron.monthly/ /etc/cron.weekly/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.d/ /etc/ ...

  7. linux分享三:文件操作

    查找文件命令: which       查看可执行文件的位置 whereis    查看文件的位置 locate       配 合数据库查看文件位置 find          实际搜寻硬盘查询文件 ...

  8. 全局获取 (Activity)Context,实现全局弹出 Dialog

    为什么需要一个全局的 (Activity)Context 需求1:在进入 app 的时候,要求做版本检测,有新的版本的时候,弹出一个 AlertDialog,提示用户版本更新 需求2:从别的设备挤下来 ...

  9. 如何安全的下载Devcon.exe文件

    devcon.exe是windows设备管理器的命令行版本,可以让你在cmd中修改设备,但是微软没有提供单独的下载,只能下载一个2G多的wdk包(windows drive kits)才行.私下使用别 ...

  10. rsync 实现文件同步 (重要数据通过rsyncr把数据同步到不同的两台服务器上,这样可以防止服务器的硬盘故障导致数据丢失) 客户端同步时如果要排某个目录

    rsync是unix系统下的数据镜像 备份工具,一般linux系统都 自带: # rpm -qa|grep rsync rsync-3.0.9-17.el7.x86_64 服务器端:10.100.0. ...