关于循环赛日程表的问题(王晓东的多边形解法)
多边形法(王晓东算法设计与分析教材上的实现,比较费解,比较牛逼)
#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;
}