求解一个简单的有关问题。

求解一个简单的问题。。。。
我是一个初学者。。遇到了这样一个问题。。求解一个简单的有关问题。
在Darkness的研究中,他发现这些金字塔是通过一圈一圈堆叠起来建造的,如果将其每块砖用一个从1开始的正整数进行标号,那底面边长为5的金字塔建造过程可以通过下面这个矩阵加以描述。

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
现在请根据给定的底面边长N,仿造上述矩阵描述金字塔的建造过程。

Input
多组测试数据。

每组数据一行,一个正整数N(1<=n<=50),表示金字塔的底面边长。

Output
对于每组数据,输出一个N*N的矩阵,矩阵中每个数使用空格隔开。(具体格式请参照样例)

Sample Input
5
Sample Output
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9


以上是题面。。
我在写这道题是遇到了一个状况,就是输入1到31时都会出现正确答案。。但是32以后就出现一种很奇怪的异常,每一行数字都一样。。不知道是什么状况。。。。献上代码和异常情况,求高人破求解一个简单的有关问题。。。。。



#include <iostream>
using namespace std;



int main()
{
int n;
while(cin>>n)
{
unsigned int a[n][n];
for (int i = 1; i <=n ; i++)
{
for (int j = 0; j < n+1; j++)
{
a[j][i]=0;
}
}
a[1][1]=1;
if(n%2==1)
{
for(int j=1;j<=n/2;j++)
{
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}
for(int i=j+1;i<=n-j+1;i++)
{
a[n-j+1][i]=a[n-j+1][i-1]+1;
}
for(int i=n-j;i>=j;i--)
{
a[i][n-j+1]=a[i+1][n-j+1]+1;
}
for(int i=n-j;i>=j+1;i--)
{
a[j][i]=a[j][i+1]+1;
}
}
int j;
j=(n/2)+1;
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}


}
if(n%2==0)
{
for(int j=1;j<n/2;j++)
{
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}
for(int i=j+1;i<=n-j+1;i++)
{
a[n-j+1][i]=a[n-j+1][i-1]+1;
}
for(int i=n-j;i>=j;i--)
{
a[i][n-j+1]=a[i+1][n-j+1]+1;
}
for(int i=n-j;i>=j+1;i--)
{
a[j][i]=a[j][i+1]+1;
}
}
int j;
j=(n/2);
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}
for(int i=j+1;i<=n-j+1;i++)
{
a[n-j+1][i]=a[n-j+1][i-1]+1;
}
for(int i=n-j;i>=j;i--)
{
a[i][n-j+1]=a[i+1][n-j+1]+1;
}


}

for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-1;j++)
{
cout<<a[j][i]<<" ";
}
cout<<a[n][i]<<endl;
}
}
return 0;
}


异常的情况。。如图。。
求解一个简单的有关问题。

------解决方案--------------------
#include <stdio.h>
#define MAXN 100
int m[MAXN+2][MAXN+2];
char d;
int x,y,k,n;
void main() {
    while (1) {
        printf("Input n(1..%d):",MAXN);
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%d",&n)) {