读书人

关于循环赛日程表的有关问题(王晓东的

发布时间: 2013-07-01 12:33:04 作者: rapoo

关于循环赛日程表的问题(王晓东的多边形解法)



多边形法(王晓东算法设计与分析教材上的实现,比较费解,比较牛逼)

#include <stdio.h>

#define N 1000

int a[N][N];

int b[N];

inline bool odd(int n)

{

return n & 1;

}

void init()

{

int i;

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

a[i][0]=i;

}

void tour(int n)

{

a[n][1]=n;

if(n==1) return;

int m=odd(n) ? n : n-1;

int i,j,k,r;

for(i=1;i<=m;++i)

{

a[i][1]=i;

b[i]=i+1;

b[m+i]=i+1;//这里开辟多一倍空间的意图是什么?

}

for(i=1;i<=m;++i)

{

a[1][i+1]=b[i];

a[b[i]][i+1]=1;

for(j=1;j<=m/2;++j)

{
//下面前两句看不懂,只知道后两句是赋值[i+1]列的,而且逻辑也搞不懂,但画图出来一看也没什么问题。

k=b[i+j];

r=b[i+m-j];

a[k][i+1]=r;

a[r][i+1]=k;

}

}

}

void out(int n)

{

if(n==1)

{

printf("1\n");

return;

}

int i,j;

int m;

if(odd(n))

m=n+1;

else

m=n;

for(i=1;i<=n;++i)

{

for(j=1;j<=m;++j)

{

if(a[i][j]>n)

printf("0 ");

else

printf("%d ",a[i][j]);

}

printf("\n");

}

}

int main()

{

int n;

init();

while(scanf("%d",&n),n)

{

tour(n);



out(n);

}

return 0;



}




[解决办法]
这个构造法本来就只适用于总人数奇数的。偶数的时候需要分治。
[解决办法]
偶数情况用多边形大概是不行的
实际上偶数和奇数是一样的,比如6个,你就把5个的轮空换成6就可以了
[解决办法]
引用:
引用:偶数情况用多边形大概是不行的
实际上偶数和奇数是一样的,比如6个,你就把5个的轮空换成6就可以了
感觉不是轮流的,是将一个永远轮空,那样每一个就能跟这个对上了,还不清楚,回去画画图看看效果先

假定6个,每次5个轮空的那个修改为对6就ok了,每轮都有人轮空,每轮轮空的人都不同。

读书人网 >软件架构设计

热点推荐