现在的位置: 首页 > 综合 > 正文

排名确定

2018年01月17日 ⁄ 综合 ⁄ 共 2003字 ⁄ 字号 评论关闭

有 个比赛队(1<=N<=500) ,编号依次为 123, 。 。 。 。 ,进行比赛,比赛结束后, 裁判委员会要将所有参赛队伍从前往后依次排名, 但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即 P1 赢 P2,用 P1P2 表示,排名时 P1 在 P2 之前。试编写程序,输出各队的排名顺序。

1. 需求规格说明

2. 有 个比赛队(1<=N<=500) ,编号依次为 123, 。 。 。 。 ,进行比赛,比赛结束后, 裁判委员会要将所有参赛队伍从前往后依次排名, 但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即 P1 赢 P2,用 P1P2 表示,排名时 P1 在 P2 之前。试编写程序,输出各队的排名顺序。

 

2.总体分析与设计

1)设计思想:

(<五号宋体>,具体内容:存储结构、主要的算法思想。)

题目要求邻接矩阵存储。

利用拓扑排序,将入度为0的点首先进入队列,设一个标记,将与他们相连的边都删掉,入度减一,在检查入度为零的进入队列。直到所有的点全部进行完毕。

排序阶段用next_permutation进行排序

3)详细设计表示:

(<五号宋体>,具体内容:主要算法的框架。)

ifstream in("排名确定.txt");

int v, e,v1,v2;

char temp;

in >> v >> temp >> e;

graph G(v, e);

for (int i = 0; i < e; i++){

in >> temp >> v1 >> temp >> temp >> v2;

G.Add(v1, v2);

}

G.TopsortbyQueue();

in.close();

3.编码

<五号宋体>,具体内容:问题是如何解决的,编码过程中的困难与解决方法。)

困难1开始的时候不知道怎样去解决队名的问题,因为队名是p1-n;我之后使用的拓扑排序使用的是1-n,后来我和几位同学讨论的时候发现可以用1-n来替代队名,输出的时候只需要在前面加上p这个字母就行。

困难2这个程序并非我之前写的那个,我用栈做了一个,中间花了好多时间进行调试,不过因为我对书上的那个栈理解不是很透彻,所以下标等很多问题我都未解决,这个也花了几天时间还是未有结果。最后我选择了让同学教我怎么用队列做的思想,而且因为没时间再去敲队列的相关代码,就直接借用了同学的。

4.小结

<五号宋体>,具体内容:经验与体会,或需要改进的地方)

这一题的代码我写了很久,因为我对书上栈的运用不是很懂,所以到最后的时候队名的传递总会有这样那样的问题,我调试了很久还是不行,整个人很焦躁。后来感觉我自己实在调试不出来的时候,就让同学帮我讲讲他的思路,后来才做了出来。

5. 答案截图

 

 

 

6.附录

<五号宋体>,部分核心代码)

int v, e,v1,v2;

char temp;

in >> v >> temp >> e;

graph G(v, e);

for (int i = 0; i < e; i++){

in >> temp >> v1 >> temp >> temp >> v2;

G.Add(v1, v2);

}

inDegree();

queue  Q;

int i; 

for (i = 1; i <=VerticesNum(); i++){

if (indegree[i] == 0){

indegree[i]=-1;

Q.Enqueue(i);

A[N]=i;N++;

}

}

B[t]=N;t++;

do{

while (!Q.isEmpty()){

int v;

Q.Dequeue(v);

indegree[v]=-1;

for (i = 1; i <= VerticesNum(); i++){

if (Exist(v, i)){

indegree[i]--;

Remove(v, i);

}

}

}

for (i = 1; i <= VerticesNum(); i++){

if ((indegree[i] == 0)){

indegree[i]=-1;

Q.Enqueue(i);

A[N]=i;N++;

}

}

B[t]=N;t++; 

}while (!Q.isEmpty());

fstream file_out("A.txt",ios::out);

int M=0;

do

{

for(int i=0;i<N;i++){

file_out<<A[i]<<" ";

}

file_out<<endl;M++;

} while ((next_permutation(A,A+B[0])||next_permutation(A+B[1],A+B[2])||next_permutation(A+B[2],A+B[3]))||next_permutation(A+B[0],A+B[1]));

file_out<<M;

file_out.close();

 

 

抱歉!评论已关闭.