首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2013-07-01 
关于循环赛日程表的问题(王晓东的多边形解法)多边形法(王晓东算法设计与分析教材上的实现,比较费解,比较牛

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



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

#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了,每轮都有人轮空,每轮轮空的人都不同。

热点排行