神奇的幻方

一开始感觉题面十分的复杂,但仔细看几遍题,不难发现其实我们只需要将下一个数放在其前一个数的右上方即可,若右上方的已经有数,则放在它的正下方即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define scy(x) freopen(x".in","r",stdin); freopen(x".out","w",stdout);
using namespace std;
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=(x<<1)+(x<<3)+(ch^48);
    ch=getchar();
  }
  return x*f;
}
long long s[10001][10001];
int n;
int sum=1,i,j;
int main(){
 // scy("in");
	n=read();
	i=1,j=n/2+1;

	while(sum<=n*n){
		s[i][j]=sum;

		if(sum%n==0){	++i;
   	if(i==n+1) i=1;
  }else
		--i,++j;
    if(i==0) i=n;
		if(j==n+1) j=1;
     ++sum;
	}
  	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
   printf("%lld ",s[i][j]);
 }
   printf("
");
	}

    return 0;
}
原文地址:https://www.cnblogs.com/scy-fisheep/p/13803573.html