输入一个自然数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.youkuaiyun.com/t/20050513/14/4004333.html#-------这是链接地址。
自己总结了下,才有了以上代码。
另外意外发现了一个自己以前不知道的知识点,现在只是知道其然,不知道其所以然。具体情况如下:
在上题中,我刚开始给SnakeMatrix()函数传的是a的二级指针,然后在该函数中以addr[i*n+j]=num++;来访问,但程序报错,若传的是二维数组的首地址,却能正常运行。
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.youkuaiyun.com/t/20050513/14/4004333.html#-------这是链接地址。
自己总结了下,才有了以上代码。
另外意外发现了一个自己以前不知道的知识点,现在只是知道其然,不知道其所以然。具体情况如下:
在上题中,我刚开始给SnakeMatrix()函数传的是a的二级指针,然后在该函数中以addr[i*n+j]=num++;来访问,但程序报错,若传的是二维数组的首地址,却能正常运行。