输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素。 N=3时: 1 2 3 8 9 4 7 6 5 【输入形式】 从标准输入读取一个整数N。 【输出形式】 向标准输出打印结果。输出符合要求的方阵,每个数字占5个字符宽度,向右对齐,在每一行末均输出一个回车符。 【输入样例】 4 【输出样例】 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
#include <iostream>using namespace std;void SnakeMatrix( int **addr, int n ); int main(){ int i,j,N; bool flag = true; while(flag) { cout<<"请输入维数:"; cin>>N; if(N<2||N>9) cout<<"非法输入"<<endl; else flag = false; } int **a = new int*[N]; for(i=0;i<N;i++) { a[i] = new int[N]; } SnakeMatrix(a,N); for(i=0;i<N;i++) { for(j=0;j<N;j++) cout<<a[i][j]<<"/t"; cout<<endl<<endl<<endl; } for(i=0;i<N;i++) { delete []a[i]; } delete []a; system("pause");}void SnakeMatrix( int **addr, int n ){ enum DIRECT { Up, Down, Left, Right }; int num,i,j,layer; num=1; i=0; j=0; layer = 0; DIRECT Direct = Down; while(num<=n*n) { addr[i][j]=num++; switch(Direct) { case Down: if(++i >= n-1-layer) { i = n-1-layer; Direct = Right; } break; case Right: if(++j >= n-1-layer) { j = n-1-layer; Direct = Up; } break; case Up: if(--i <= layer) { i = layer; Direct = Left; } break; case Left: if(--j <= layer+1) { j = layer+1; layer++; Direct = Down; } break; } } }注释:
昨晚有朋友叫我做这个题目,想了好久除了比较笨的每行每列的输入,没有想出什么好的办法。今天在网上搜索了下这类题,http://topic.csdn.net/t/20050513/14/4004333.html#-------这是链接地址。自己总结了下,才有了以上代码。另外意外发现了一个自己以前不知道的知识点,现在只是知道其然,不知道其所以然。具体情况如下:在上题中,我刚开始给SnakeMatrix()函数传的是a的二级指针,然后在该函数中以addr[i*n+j]=num++;来访问,但程序报错,若传的是二维数组的首地址,却能正常运行。
转载请注明原文地址: https://ibbs.8miu.com/read-100215.html