您的位置:首页 > 编程语言 > C语言/C++

算法提高 3000米排名预测 (把别人的C++代码改成C)

2017-03-20 18:58 375 查看
问题描述

  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。对于一个排名序列,一个预测是正确的,当且仅当预测的排名的相对顺序是排名序列的一个子序列。一个预测是错误的,当且仅当这个预测不正确。
#include <stdio.h>

int N=3,M=2;
int visitor[11][12]={
{2, 0, 1, 1},
{2, 1, 2, 0}
};
/*2
0 2 1
2 0 1 */
int result[11];
int used[11];
int SIZE=0;
int paixu[20001][11];

int judge(){
int i,j,pos;
int tag1=1,tag2=1;
for(i=0;i<M;i++){
if(visitor[i][visitor[i][0]+1]==1&&tag1){
j=1;
for(pos=0;pos<N&&j<=visitor[i][0];pos++)
if(visitor[i][j]==result[pos])  j++;
if(j<visitor[i][0]+1) tag1=0;
}
else{
j=1;
for(pos=0;pos<N&&j<=visitor[i][0];pos++)
if(visitor[i][j]==result[pos])  j++;
if(j>=visitor[i][0]+1) tag2=0;
}
if(!tag1||!tag2) break;
}
if(!tag1||!tag2) return 0;
return 1;
}

void dfs(int n){
int i;
if(n>=N&&judge()){
for(i=0;i<N;i++)
paixu[SIZE][i]=result[i];
SIZE++;
return;
}
if(n<N){
for(i=0;i<N;i++){
if(used[i]==0){
used[i]=1;
result
=i;
dfs(n+1);
used[i]=0;
}
}
}
}

int main()
{
int i,j;
scanf("%d%d",&N,&M);
for(i=0;i<M;i++){
scanf("%d",&visitor[i][0]);
for(j=1;j<=visitor[i][0];j++)
scanf("%d",&visitor[i][j]);
scanf("%d",&visitor[i][j]);
}    /**/

/*	for(i=0;i<M;i++){
for(j=0;j<=visitor[i][0]+1;j++) printf("%d ",visitor[i][j]);
printf("\n");
}                        */

dfs(0);
printf("%d\n",SIZE);
for(i=0;i<SIZE;i++){
for(j=0;j<N;j++)
printf("%d ",paixu[i][j]);
printf("\n");
}    /*    */
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: