魔方阵,代码有误,找不出原因,求大神解困解决方案
魔方阵,代码有误,找不出原因,求大神解困
#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语言的,改下输出方式就行了
#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; }
------解决方案--------------------
貌似解决了,恭喜