题目描述
在伯兰的足球节开幕式中有一个奇怪的魔术秀。最有经验的魔术师会找一个 n×n的矩阵(n为偶数)。足球节没有这个魔术秀绝对不会开始。这个矩阵应该包含0~n-1的正整数,且包含以下三条规则:
1、主对角线上的数应该都是0
2、且整个矩阵应该都是对称的
3、每行每列上的数都是不同的。
魔术师很不喜欢一遍又一遍的接矩阵(魔术师真懒),于是就请你写一个程序来帮助他们解决矩阵问题。
输入输出格式
输入格式
只有一行,包含一个偶整数 (2<=n<=1000)
输出格式
n行n列的矩阵。数与数之间要空格。如果有多个答案,输出任意一个即可
神奇的构造。
首先应该是一个基本的构造方法来实现题目中的要求三:每行每列上的数都是不同的。
over(i,0,n-1)over(j,0,n-1)
mp[i][j]=(i+j)%n+1;
应该是需要背下来。
实现出来:N=6
12345
23451
34512
45123
51234
这样左边和上边就已经是对称的了。
接下来实现要求一二。
直接把主对角线上的数全部转移到最右列和最下列,这样直接就是关于对角线对称,然后再把主对角线上全部赋值为0即可,然后直接输出就行了。
023451
204513
340125
451032
512304
135240
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(int i=s;i<=t;++i)
#define lver(i,t,s) for(int i=t;i>=s;--i)
using namespace std;
typedef long long ll;
const ll N=1e3+7;
const ll mod=2147483647;
const double EPS=1e-6;
ll mp[N][N],n,m;
int main()
{
scanf("%lld",&n);n--;
over(i,0,n-1)over(j,0,n-1)
mp[i][j]=(i+j)%n+1;
over(i,0,n-1)
mp[i][n]=mp[n][i]=mp[i][i],mp[i][i]=0;
over(i,0,n){
printf("%lld",mp[i][0]);
over(j,1,n)
printf(" %lld",mp[i][j]);puts("");
}
return 0;
}
#疯狂压行
有任何疑问欢迎评论哦虽然我真的很菜