当前位置: 代码迷 >> C语言 >> [讨论]悬赏千金求一算法二--联赛问题
  详细解决方案

[讨论]悬赏千金求一算法二--联赛问题

热度:169   发布时间:2006-06-06 07:43:00.0
估计是哪数组越界了,直接在输出的时候把错误的那行屏蔽住了,应该对5,9,17也正常了。
----------------解决方案--------------------------------------------------------
[CODE]#include <iostream>
#include <vector>
using namespace std;

void process(int);
void output(const vector<pair<int,int> >&);

int main()
{
int n;
while(1)
{
cin>>n;
process(n);
}

system("pause");
return 0;
}

void process(int n)
{
vector<pair<int,int> > oneCycle;
int X, Y, cycle;
bool even = false;

if(n%2 == 0)
{
cycle = n - 1;
even = true;
}
else
cycle = n;

for(int i=0; i<cycle; i++)
{
X = i;
Y = (i+1) % cycle;
while(X != Y)
{
oneCycle.push_back(pair<int,int>(X+1, Y+1));
if(--X < 0)
X = cycle-1;
Y = (Y+1) % cycle;
}
if(even)
oneCycle.push_back(pair<int,int>(X+1, n));
output(oneCycle);
oneCycle.clear();
}
}

void output(const vector<pair<int,int> > &oneCycle)
{
for(int i=0; i<oneCycle.size(); i++)
cout<<oneCycle[i].first<<" vs "<<oneCycle[i].second<<" ";
cout<<endl;
}
[/CODE]

感觉应该可以,没有仔细证明

----------------解决方案--------------------------------------------------------

原来大家都已经解决得差不多了,
我却刚发现不是2的整数幂俺的程序不行!
哎,差太远了!俺再回去好好想想

没有电脑真不方便,写个程序,还得跑来机房运行,结果却出了差错。。。。。
还得到暑假才能买电脑,郁闷死我了!


----------------解决方案--------------------------------------------------------
暑假买电脑,太好了!
你在身边无电脑情况下
能这么勤勉,有了电脑将如虎添翼。
----------------解决方案--------------------------------------------------------

我的学习不太好啦!虽然我很喜欢编程,但是却不喜欢学习,有点主次不分了.
这次四级还险着呢!!
而且我水平又低,倒是您,我看您的程序越看越自卑了!
不过我会不断努力的.呵呵,您说的那本<<tc实用大全>>我有。
确实很棒!

----------------解决方案--------------------------------------------------------
我的程序已经从5到24都可以正常工作!
可以通过修改M的值来完成设置队伍数量的功能!
希望大家可以运行测试一下,
在M=25时,运行不能正常结束。

#include <stdio.h>
#define M 13
#define N ((int)((M+1)/2)*2)
int ged[N][N]={0};
int g[N];
int T[N/2][2];
main()
{
int a,i,j,t1,t2,only;
int again=0,z,no;
for(i=0;i<N;i++) for(j=i+1;j<N;j++) ged[i][j]=1;
for(a=1;a<N;a++)
{
for(i=0;i<N/2+1;i++) T[i][0]=-1,T[i][1]=-1;
z=0;
for(i=0;i<N;i++) g[i]=0;
g[a]=1,g[0]=1;
T[z][0]=0,T[z][1]=a;
for(t1=1;t1<N;t1++)
{
no=1;
if (g[t1]==1) continue;
for(t2=t1+1;t2<N;t2++)
{
if (again) t2=T[z][1]+1,z--,again=0;
if (g[t2]==0 & ged[t1][t2]==1)
{
no=0;
z++;
T[z][0]=t1;
T[z][1]=t2;
g[t1]=1,g[t2]=1;
ged[t1][t2]=0;
break;
}
}
if (no)
{
again=1;
t1=T[z][0]-1;
g[T[z][0]]=0,g[T[z][1]]=0;
ged[T[z][0]][T[z][1]]=1;
}
}
only=-1;
for(j=0;j<=z;j++)
{
if(T[j][1]==M) {only=T[j][0];continue;}
printf("T%.2d vs T%.2d ",T[j][0],T[j][1]);
}
if (only!=-1) printf("T%.2d ",only);
printf("\n");
}
printf("\n");
}
----------------解决方案--------------------------------------------------------
我的编程思想是,先生成一个比赛表格,记录队伍之间的比赛情况(ged数组记录),当两只队伍进行过比赛时,数组ged[小号][大号]将等于0,
用g[]数组记录本轮比赛各队是否参加过了。
当两支我队伍的条件都符合时,确定队伍,并将其保存在T数组中,
当一轮比赛不能正常配对时,更换最近保存过的T数组中的比赛队伍,使其重新归队,从第二个符合条件的大号队伍中重新选择,直到能够选完为止!

----------------解决方案--------------------------------------------------------
我的程序未使用递归的方法,运行的时间较短,符合楼主提的条件,
我也是是个编程爱好者,希望大家多和我联系,多找些题目来
game0319@126.com
----------------解决方案--------------------------------------------------------
以下是引用woodhead在2006-6-6 13:39:00的发言:


感觉应该可以,没有仔细证明

好牛的算法,给讲讲思路!


----------------解决方案--------------------------------------------------------
以下是引用game0319在2006-6-7 11:41:00的发言:
我的编程思想是,先生成一个比赛表格,记录队伍之间的比赛情况(ged数组记录),当两只队伍进行过比赛时,数组ged[小号][大号]将等于0,
用g[]数组记录本直热?鞫邮欠癫渭庸?恕?lt;BR>当两支我队伍的条件都符合时,确定队伍,并将其保存在T数组中,
当一轮比赛不能正常配对时,更换最近保存过的T数组中的比赛队伍,使其重新归队,从第二个符合条件的大号队伍中重新选择,直到能够选完为止!

挺正确的,学习中。。。
----------------解决方案--------------------------------------------------------

  相关解决方案