zigzag数组

这是一篇关于面试题的博客,主要讨论如何在C++中创建一个n*n的Zigzag数组,以8为例展示数组布局,并提出了输出螺旋数组的补充题目。
摘要由CSDN通过智能技术生成

【面试题】输入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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值