關於循環賽日程表的問題(王曉東的多邊形解法) -开发者知识库

關於循環賽日程表的問題(王曉東的多邊形解法) -开发者知识库,第1张



多邊形法(王曉東算法設計與分析教材上的實現,比較費解,比較牛逼)

#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;

 

}



5 个解决方案

#1


還有,網上的一些關於多邊形解法的算法思路,我畫了一下圖,感覺不對,先給個連接

http://blog.csdn.net/sugite/article/details/7190682

例如八個人循環時,奇數對的永遠是偶數,不能對全,而且剛好重復一倍,那個多邊形的算法是不是錯的?我沒編譯過,不知道正誤,時間太緊了。
PS:會的請幫幫忙,這道題我看了好幾個小時了,叫我好好看書的,我只能回一句:我去年買了個包。我討厭這種人

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复