面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)

转载 2014年12月23日 17:59:23


//题目:输入n 求一个n*n的矩阵,规定矩阵沿45度角线递增,
 //形成一个zigzag数组,请问如何用C++实现
 //如图:
 //
 //Please Input The Number!
 //8
 //                    14    15    27    28
 //                13    16    26    29    42
 //            12    17    25    30    41    43
 //        11    18    24    31    40    44    53
 //    10    19    23    32    39    45    52    54
 //    20    22    33    38    46    51    55    60
 //    21    34    37    47    50    56    59    61
 //    35    36    48    49    57    58    62    63
 //
 //
 //分析:

//1.递增的方向只有2个:左下,右上。 如果之前是按左下递增,那么之后是按右上递增,再按左下方递增
//2.同一个斜线上数据的规律是:下标(i+j)的和都一样。

 //先看矩阵,发现矩阵对角线上部元素与下部对应元素之和为N^2-1
 //即为 Arr[i][j]+Arr[N-1-i][N-1-j]=N^2-1
 //
 //所以我们只需要处理上三角即可,下三角可推出。
 //观察上三角中。
 //数组各项横纵坐标与值的关系
 //0   0
 //0   1
 //1   2
 //2   3
 //1   4
 //0   5
 //0   6
 //1   7
 //2   8
 //3   9
 //4   10
 //从中分析 发现(i+j)的和与结果有关系
 //令 s=i+j
 //s=0  只有0 1个元素落在这个范围
 //s=1  有2个
 //s=2  有3个
 //s=3  有4个
 //s=4  。。。
 //这样
 //任意一项Arr[i][j],令s=i+j
 //则该项之前的s-1项有
 //1+2+...+s=s(s+1)/2这么多个数,那么该数位于哪个位置?
 //我们再看看 添加其前s-1项的和
 //0     0
 //0     1
 //1     1
 //2     3
 //1     3
 //0     3
 //0     6
 //1     6
 //2     6
 //3     6
 //4   10  10
 //从中我们可以看出 ,当s能够被2整除时 Arr[i][j]=s(s+1)/2+j
 //否则 Arr[i][j]=s(s+1)/2+i;

#include <iostream>
 #include <iomanip>
 using namespace std;
 
 int main()
 {
     int N;
     int s,i,j;
     cout<<"Please Input The Number!"<<endl;
     cin>>N;
     int** Arr=new int*[N];//int** Arr=(int **)malloc(N*sizeof(int));
     for(i=0;i<N;i++)
         Arr[i]=new int[N];//Arr[i]=(int*)malloc(N*sizeof(int));严格来讲这里应该加强防错处理。
     for(i=0;i<N;i++)
         for(j=0;j<N-i;j++)
         {
             s=i+j;
             if(s<N)
             {
                 Arr[i][j]=s*(s+1)/2+((s%2==0)? j:i);
             }
         }
         for(i=N-1;i>0;i--)
             for(j=N-i;j<N;j++)
             {
                 Arr[i][j]=N*N-1-Arr[N-1-i][N-1-j];
             }
     for(i=0;i<N;i++)
     {
         for(j=0;j<N;j++)
             cout<<setw(6)<<Arr[i][j];
         cout<<endl;
     }
     return 0;
 }

另外一种实现:

int **printnxn(int **pSpace, int N)
{
	int s, i, j;
	int squa;
	pSpace = (int **)malloc(N*sizeof(int *));
	if (pSpace == NULL)
		return 0;
	for (i = 0; i<N; i++)
	{
		if ((pSpace[i] = (int *)malloc(N*sizeof(int))) == NULL)
		{
			while (--i>0)
			{
				free(pSpace[i]);
			}
			free(pSpace);
			return 0;
		}
	}
	squa = N*N;
	for (i = 0; i<N; i++)
	{
		for (j = 0; j<N; j++)
		{
			s = i + j;
			if (s<N)//三角形,求面积,加上偏移
			{
				pSpace[i][j] = s*(s + 1) / 2 + (((i + j) % 2 == 1) ? i : j);
			}
			else//转换成上面的方式
			{
				s = (N - 1 - i) + (N - 1 - j);
				pSpace[i][j] = squa - s*(s + 1) / 2 - (N - (((i + j) % 2 == 1) ? i : j));
			}
		}
	}
	for (i = 0; i<N; i++)
	{
		for (j = 0; j<N; j++)
		{
			printf("%6d", pSpace[i][j]);
		}
		printf("\n");
	}
	return pSpace;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int N;
	scanf_s("%d", &N);
	int **p = NULL;
	printnxn(p, N);
	system("pause");
	return 0;
}


相关文章推荐

对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解

void print_mat(int **mat, int mat_size)   {       int i, j;       cout     for(i = 0; i     {...

zigzag数组:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组

面试题目: 输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)...

在一个从左到右从上到下都是递增的m*n的矩阵中找一个数x

2.【附加题】–一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高。 #include #include using namespace std; boo...

输出一个顺时递增数据的N阶矩阵

输出一个N阶矩阵 比如输入1 输出 1
  • sesiria
  • sesiria
  • 2017年10月20日 08:41
  • 45

判断二叉树平衡/求二叉树的镜像 附属: 一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中

判断二叉树是否平衡、求二叉树的镜像 一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中时间复杂度为最坏为O(m+n)...

对一个n*n矩阵,通过行变换,使其每行元素的平均值按递增顺序排序

原题:编写一个算法,对一个n*n矩阵,通过行变换,使其每行元素的平均值按递增顺序排序。 #include #include #include #include//控制输出格式的头文件 #include...

2. 有一个二维数组.----杨氏矩阵 。数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);

//2. //有一个二维数组.----杨氏矩阵 //数组的每行从左到右是递增的,每列从上到下是递增的. //在这样的数组中查找一个数字是否存在。 //时间复杂度小于O(N); #include #in...

网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步

package wangyi; /** * Created by Administrator on 2016/12/7. * 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'...

“幻方阵”是指一个AN×N矩阵

  • 2009年04月14日 00:19
  • 2KB
  • 下载

输入一个n,在屏幕上打印出N*N的矩阵(华为面试题)

题目:输入一个n,在屏幕上打印出N*N的矩阵。 例如:输入一个3,则输出: 1 2 3 8 9 4 7 6 5 输入一个4,刚输出:  1  2  3  4 12 13 14  5 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)
举报原因:
原因补充:

(最多只允许输入30个字)