Description
n
<
=
1000
n<=1000
n<=1000
Solution
- 构造题,做法简单,思路奇妙(打表找规律)。
- 一种构造方法是按顺序将(1,2)(1,3)…(1,n)(2,3)(2,4)…(n-1,n)加入n-1组里面。
如果上一个加到了第i组里面,那么下一个就要从i+1组开始判断能不能加进去。 - 还有另一种构造是这样的:
相当于是枚举匹配的(i,j)的中间点(可以假定将n翻成2n),还剩下一个就是2p了。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 1005
using namespace std;
int n,i,j,k,bz[maxn][maxn];
int main(){
// freopen("problem.in","r",stdin);
// freopen("problem.out","w",stdout);
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++) if ((j+j)%(n-1)==i){
printf("%d %d ",j+1,n),bz[j][n-1]=bz[n-1][j]=1;
break;
}
for(j=0;j<n-1;j++){
k=(i+n-1-j)%(n-1);
if (!bz[j][k]&&j!=k) {
printf("%d %d ",j+1,k+1),bz[j][k]=bz[k][j]=1;
}
}
printf("\n");
}
}