魔方阵,代码有误,找不出原因,求大神解困解决方案

魔方阵,代码有误,找不出原因,求大神解困
#include "stdafx.h"
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{int i,j,n,k,count,a[16][16];
int p=1;
while(p==1)
{cout<<"输入(1~15的阶数):";
  cin>>n;
if((n>0)&&(n<16)&&(n%2!=0))
p=0;
}


for(i=1;i<=n;i++)//数组初始化
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;

a[1][j]=1;



i=1;

for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;

if(i<1&&j>3)
{i=i+2;
j=j-1;
a[i][j]=k;
}

else{ if(i<1)i=n;
if(j>3)j=1;
a[i][j]=k;}

if(a[i][j]==0)
a[i][j]=k;
else{i=i+2;j=j+1;a[i][j]=k;}


}

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


}
每一行,每一列与对角线之和相等,例如:
8 1 6
3 5 7
4 9 2

------解决方案--------------------
数组下标从0开始
for(i=1;i<=n;i++)//数组初始化
for(j=1;j<=n;j++)
a[i][j]=0;
这里应该是一处错误
很晚了,没时间看了,先睡觉,有空来看下,给出参考代码,c语言的,改下输出方式就行了
C/C++ code

#include <stdio.h>
int main()
{
    /* 
        1、定义一个变量,从键盘输入一个奇数
        2、定义一个n行n列的二维数组
        3、循环,从1到n*n,每次循环放入一个数
            1)计算该数要放的位置(下标)
                第一次,位置[0][n/2]
                以后的位置,行--,列++
                如果行越界,行=n-1
                如果列越界,列=0
                如果行列都越界,行加2,列减1
                如果冲突,行加2,列减1                
            2)把这个数放入到计算好的位置上
        4、打印二维数组
    */

    int n;
    printf("please in put a ji number:");//ji number,嗯,奇数,囧...
    scanf("%d",&n);
    if(n%2==0){
        printf("input error, exit the program!\n");
        return 0;
    }
    int r[n][n];//如果维数是变量,不能使用int a[n][n]={0}这种方法初始化
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            r[i][j]=0;
        }
        
    }
    //3、循环放入第一个数
    int row=0;
    int col=n/2;
    for(i=1;i<=n*n;i++){
        //将数放入指定的位置    
        r[row][col]=i;
        //计算下一个位置
        row--;
        col++;
        //处理越界和冲突
        if(row<0&&col<n){row=n-1;}
        else if(col>=n&&row>=0){col=0;}
        else if(row<0&&col>=n){row+=2;col--;}
        else if(r[row][col]!=0){row+=2;col--;}
    }
    //4\打印结果
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d\t",r[i][j]);
        }
        printf("\n");
    }
    return 0;
}

------解决方案--------------------
貌似解决了,恭喜