| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3133 人关注过本帖
标题:[讨论]悬赏千金求一算法二--联赛问题
只看楼主 加入收藏
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
估计是哪数组越界了,直接在输出的时候把错误的那行屏蔽住了,应该对5,9,17也正常了。

http://myajax95./
2006-06-06 07:43
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
[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]

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

2006-06-06 13:39
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

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

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


对不礼貌的女生收钱......
2006-06-06 19:37
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
暑假买电脑,太好了!
你在身边无电脑情况下
能这么勤勉,有了电脑将如虎添翼。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-06 19:46
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

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

对不礼貌的女生收钱......
2006-06-06 19:54
game0319
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-6-4
收藏
得分:0 
我的程序已经从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");
}
2006-06-07 11:31
game0319
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-6-4
收藏
得分:0 
我的编程思想是,先生成一个比赛表格,记录队伍之间的比赛情况(ged数组记录),当两只队伍进行过比赛时,数组ged[小号][大号]将等于0,
用g[]数组记录本轮比赛各队是否参加过了。
当两支我队伍的条件都符合时,确定队伍,并将其保存在T数组中,
当一轮比赛不能正常配对时,更换最近保存过的T数组中的比赛队伍,使其重新归队,从第二个符合条件的大号队伍中重新选择,直到能够选完为止!
2006-06-07 11:41
game0319
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-6-4
收藏
得分:0 
我的程序未使用递归的方法,运行的时间较短,符合楼主提的条件,
我也是是个编程爱好者,希望大家多和我联系,多找些题目来
game0319@126.com
2006-06-07 11:46
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用woodhead在2006-6-6 13:39:00的发言:


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

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


http://myajax95./
2006-06-07 13:03
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用game0319在2006-6-7 11:41:00的发言:
我的编程思想是,先生成一个比赛表格,记录队伍之间的比赛情况(ged数组记录),当两只队伍进行过比赛时,数组ged[小号][大号]将等于0,
用g[]数组记录本直热?鞫邮欠癫渭庸?恕?lt;BR>当两支我队伍的条件都符合时,确定队伍,并将其保存在T数组中,
当一轮比赛不能正常配对时,更换最近保存过的T数组中的比赛队伍,使其重新归队,从第二个符合条件的大号队伍中重新选择,直到能够选完为止!

挺正确的,学习中。。。


http://myajax95./
2006-06-07 13:05
快速回复:[讨论]悬赏千金求一算法二--联赛问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028740 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved