【面试题】输入n,求一个n*n矩阵,形成一个zigzag数组。
n=8时,数组如下:
方法一:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N;
int i,j,s=0;
int dir=0;
printf("请输入N:");
scanf("%d",&N);
int **a=(int**)malloc(N*sizeof(int*));
if (a == NULL)
return 0;
for(i=0;i<N;i++)
{
if( (a[i]=(int*)malloc(N*sizeof(int)))== NULL )
{
while(--i>=0)
free(a);
}
}
i=0;
j=0;
while(s < N*N)
{
a[i][j]=s;
switch(dir)
{
case 0: //方向向右
j++;
if(0 == i)
dir=1;
else if(N-1 == i)
dir=3;
break;
case 1: //方向向左下
i++;
j--;
if(N-1 == i)
dir=0;
else if(0 == j)
dir=2;
break;
case 2: //方向向下
i++;
if(N-1==j)
dir=1;
else if(0 == j)
dir=3;
break;
case 3: //方向向右上
i--;
j++;
if(N-1 == j)
dir=2;
else if(0 == i)
dir=0;
break;
default:
break;
}
s++;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
方法二:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N;
int s,i,j;
int squa;
scanf("%d",&N);
int **a=(int **)malloc(N*sizeof(int*));
if (a == NULL)
return 0;
for(i=0;i<N;i++)
{
if( (a[i]=(int*)malloc(N*sizeof(int)))== NULL )
{
while(--i>=0)
free(a);
}
}
squa=N*N;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
s=i+j;
if(s<N)
a[i][j]=s*(s+1)/2+(((i+j)%2 == 0) ?i:j);
else
{
s=(N-1-i)+(N-1-j);
a[i][j]=squa-s*(s+1)/2-(N-(((i+j)%2 == 0) ?i:j));
}
}
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
【面试题补充】输出螺旋数组
/*
螺旋数组是一个从中心螺旋形扩展的数组,如4*4的螺旋数组:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
*/
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
int N;
int s,i,j,dir,step;
int squa;
cout<<"将要实现N*N的zigzag矩阵,请输入N([1 100]):";
bool input_again=false;
cin>>N;
//生成行进方向向量
squa=N*N;
vector<int> dirs(squa);//四个行进方向0(右),1(下),2(左),3(上)
s=1; //计数器
dir=0; //方向
step=1; //步长
while(s<=squa)
{
//走一步,步长为step
for(i=0;i<step;i++)
dirs[s++]=dir;
if(dir%2) //下一步的步长
step++; //方向为1,3时,下一步的步长加一
dir=(dir+1)%4; //下一步的方向
}
//中心坐标, 即螺旋中心坐标
if(N%2) //奇数
{
i=N/2;
j=i;
}
else //偶数
{
i=N/2-1;
j=i;
}
//生成螺旋数组
vector<vector<int> > spiral(N,vector<int>(N));
s=1;
while(s<=squa)
{
spiral[i][j]=s;
//根据行进方向向量dirs, 确定下一点的位置
switch(dirs[s])
{
case 0:
j++;
break;
case 1:
i++;
break;
case 2:
j--;
break;
case 3:
i--;
break;
default:
break;
}
s++;
}
cout<<"********************************************************"<<endl;
cout<<N<<"*"<<N<<"的螺旋数组:"<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout<<setw(6)<<spiral[i][j];
cout<<endl;
}
cout<<"按任意键继续……";
cin.clear();
cin.sync();
cin.get();
return 0;
}