楼主该不会是用 4 个不同的方向写 4 种不同的代码吧,那就有点坑爹了
回复 9楼 草狼
square[i][j] = (N+1-i) * N -j + 1; else
square[i][j] = (i - 1) * N + j;
这个后面的公式是怎么来的? 有什么依据嘛 讲一下
#include <iostream> using namespace std; int main() { int i,j,m=1,n,a[11][11]; cout<<"请输入1-11的奇数"<<endl; while(1) { cin>>n; //获取输入值,为一个奇数 if(n%2==0 || n>11 ) //对输入数据进行验证 {cout<<"输入超出范围或不是奇数,请重输!"<<endl;continue;} else {break;} } i=0,j=n/2; //定义首排列地址,也就是从1开始放数,把1放在第1行,中间列,当然也可以有其他排法,只要遵循洛书口诀即可! 下面就要对数组赋值,让它符合3值和相等。 while(m<=n*n) //定义最大数,N*N,M就是要放到二維数组里的数,从1开始排放!在这里是向上右方向排列,遇到N的整倍数,下一个m值放下面! { a[i][j]=m; //开始放数,最开始M是1,所有把1放进去,之后自增! m++,i--,j++; //行数向上移动,列数向右移动。所以是i--,j++, if((m-1)%n==0&&m>=1) //当M的值为N的整数倍,并且其值大于等于1的时候,把行和列规位,这里可能不好理解。注意上句执行了i--,j++,也就是位置已经改变了。 i+=2,j--; if(i<0) i=n-1; //超过上边界,回档,也就是第一行继续向上移就转到了最下面一行! if(j>(n-1)) j=0; //超过右边界,回档,最后一列转到最前面一列。 } for(i=0;i<n;i++) //循环打印出二維数组值! { for(j=0;j<n;j++) { cout.width(5); cout<<a[i][j]<<" "; } cout<<"\n"<<endl; } return 0; }用C++编译器,编译通过!具体算法看洛书口诀!
int MatIndex(int n, int r, int c) { int p, q, s, h; h = n >> 1; p = r + c - h; if(p >= n) p -= n; if(p < 0) p += n; if(p <= h) q = p << 1; else q = ((p - h - 1) << 1) + 1; s = q - r; if(s < 0) s += n; return p * n + s + 1; }