幻方

Problem description
幻方是一种很有意思的数字矩阵,在很早著名的九宫八卦阵就与幻方有关。
幻方的定义为:
1 到 N*N 的整数填入N*N的方格中,每行和每列以及对角线的数字之和必须是相等的。
你作为八卦公司的顶级程序员,现在需要你解决一个问题,将任意奇数阶的幻方找出来。


Input
输入包括多个测试集,每行为一个正奇数N(1 <= N < 1000),0作为输入的结束且不需要处理。


Output
对于输入的每一个N, 输出一个它所对应的N阶幻方,如果存在多个,任意一个即可。
每个幻方为N*N的矩阵,
对于每个幻方,每行输出幻方的一行,每行中的数字之间用一个或多个空格分开。不同的幻方之间用一个空行分开。


Sample Input
1
3
0

Sample Output
1

4 9 2
3 5 7
8 1 6
==================================================================================

 //幻方矩阵 //1到n*n的整数放到n*n的矩阵中,要求每行每列以及对角线的数字之和是相等的 //将任意奇数阶的幻方找出来 //input:幻方的阶数,以0结束 //output:幻方,若有多个,输出任意一个 #include <stdafx.h> #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; #define TRUE 1 #define FALSE 0 typedef struct position { char beFilledIn; }POSITION; typedef struct asqure { int a; POSITION p; }ASQURE,*PASQURE; int _isHad(int x,int y,int n,PASQURE p) //TRUE表示已经有了 { if ((p + x + n * y)->p.beFilledIn == TRUE) return TRUE; else{ (p + x + n * y)->p.beFilledIn = TRUE; return FALSE; } } void GenericSqure(int n)//输入阶次,生成幻方 { int nTmp = n*n; PASQURE pSqure = (ASQURE *)malloc(nTmp * sizeof(ASQURE)); int xTmp,yTmp; int xTmpPre,yTmpPre; for(int i = 0; i < nTmp; i++) (pSqure + i)->p.beFilledIn = FALSE; xTmpPre = (n - 1) / 2; yTmpPre = 0; if (_isHad(xTmpPre,yTmpPre,n,pSqure) == FALSE) { (pSqure + xTmpPre + yTmpPre * n)->a = 1; } for (int i = 1; i < nTmp; i++) { yTmp = (yTmpPre - 1) % n; while(yTmp < 0) yTmp += n; //把负的加成正的 xTmp = (xTmpPre + 1) % n ;//第一项放到1行中间的一列 if ((_isHad(xTmp,yTmp,n,pSqure) == TRUE)||(yTmpPre == 0 && xTmpPre == (n - 1))) { yTmp = (yTmpPre + 1) % n; xTmp = xTmpPre; _isHad(xTmp,yTmp,n,pSqure); } xTmpPre = xTmp; yTmpPre = yTmp; (pSqure + xTmp + yTmp * n)->a = i + 1; } for(int i = 0;i < nTmp; i++) { int x = (pSqure + i)->a; if(i % n == (n-1)) {printf("%-10d/n",x);} else printf("%-10d",x); } cout<<endl; } int main(){ int MagicSqure[100]; int i = -1; int Maximum = 0; cout<<"请输入幻方的阶数,以'0'结束:"<<endl; do { i++; cin>>MagicSqure[i]; } while (MagicSqure[i] != 0); Maximum = i; for (i = 0;i < Maximum;i++) { if (MagicSqure[i] % 2 == 0) { cout<<" 第"<<i<<"项不是奇数,跳过"<<endl; continue; } //开始计算幻方... GenericSqure(MagicSqure[i]); } system("pause"); return 0; }

丫丫的,这个程序编了2天,气死我了~

算法也是知道的,但是就是不正确

后来才发现问题所在啊……

原来是_isHad()那个if判断进去后,修改了位置,但是修改的位置并没有用_isHad()再次只能一遍,所以下次有程序去判断那个位置的_isHad()后返回的还是FALSE……

现在还有一个不能算是Bug 的Bug,重新计算position后并没有判断那个位置是否能用。

不过根据算法来看,那个位置肯定是能用的咧~~

不过程序还是过于复杂了,看到有人用一句话写出来,还得学习学习~

#include <stdio.h> #include <stdafx.h> int main(void) { int i,j,n; while(scanf("%d",&n)+1)for(i=j=n;j--||(putchar(10),j=n-1,--i);printf("%-7d",((n-1)*3/2+i-j)%n*n+((5*n-1)/2+i+j-n-n)%n+1)); return 0; }

你可能感兴趣的:(算法,struct,System,input,八卦,output)