Time Limit: 20 Sec
Memory Limit: 256 MB
http://www.luogu.org/problem/show?pid=2615
Input
输入文件只有一行,包含一个整数N即幻方的大小。
Output
输出文件包含N行,每行N个整数,即按上述方法构造出的N*N的幻方。相邻两个整数之间用单个空格隔开。
Sample Input
3
Sample Output
8 1 6
3 5 7
4 9 2
题意
题解:
模拟题模拟题,热情的100分
代码
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; int X[45],Y[45]; int m[45][45]; int main() { memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); memset(m,0,sizeof(m)); int n;scanf("%d",&n); X[1]=1,Y[1]=n/2+1; m[X[1]][Y[1]]=1; /* 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列; 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行; 3.若(K−1)在第一行最后一列,则将K填在(K−1)的正下方; 4.若(K−1)既不在第一行,也不在最后一列,如果(K−1)的右上方还未填数 则将K填在(K−1)的右上方,否则将K填在(K−1)的正下方。 */ for(int i=2;i<=n*n;i++) { if(X[i-1]==1&&Y[i-1]!=n) X[i]=n,Y[i]=Y[i-1]+1; else if(Y[i-1]==n&&X[i-1]!=1) Y[i]=1,X[i]=X[i-1]-1; else if(X[i-1]==1&&Y[i-1]==n) X[i]=X[i-1]+1,Y[i]=Y[i-1]; else if(X[i-1]!=1&&Y[i-1]!=n&&m[(X[i-1]-1-1)%n+1][(Y[i-1])%n+1]==0) X[i]=X[i-1]-1,Y[i]=Y[i-1]+1; else X[i]=X[i-1]+1,Y[i]=Y[i-1]; m[X[i]][Y[i]]=i; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(j==1)printf("%d",m[i][j]); else printf(" %d",m[i][j]); } printf("\n"); } }
原文:http://www.cnblogs.com/qscqesze/p/4948428.html