面试例题:输入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;
}


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

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

输入n求N*N矩阵,规定矩阵沿45度线递增

输入N,求一个矩阵N*N,规定矩阵沿45度线递增,形成zigzag数组 代码写的有点挫,不过容易理解...
  • a925907195
  • a925907195
  • 2014年12月01日 22:50
  • 1014

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

输入n,求一个n x n矩阵,规定矩阵沿45度线递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用c++实现?[中国台湾著名硬件公司2007年11月面试题]      0...
  • kang2618
  • kang2618
  • 2017年02月01日 23:36
  • 190

用c++实现一个n*n矩阵,矩阵沿着45度递增,形成zigzag数组

#include #include using namespace std; int main() { int N; int s, i, j; int squa; cin>>N...
  • wangfengfan1
  • wangfengfan1
  • 2015年07月26日 20:49
  • 507

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

#include #define MAX 100 int matrix[MAX][MAX]; void PrintMatrix(int x,int y,int start,int n) {...
  • susidian
  • susidian
  • 2015年09月18日 23:13
  • 1939

美团面试题 将一个n X n二维数组逆时针旋转45度后打印

#include void RotatePrint(int a[][3],int n) { int start = 0; int end = n-1; for(int i=2;i>=0;i--) {...
  • susidian
  • susidian
  • 2015年09月08日 14:18
  • 1455

编写程序输入一个n*n的矩阵,求出两条对角线元素值之和

//编写一个程序输入一个n*n的矩阵,求出两条对角线元素值之和 #include using namespace std; int main() { int num; cout n...
  • xujing19920814
  • xujing19920814
  • 2017年02月05日 18:13
  • 647

Z字形扫描-CCF测试往届题

在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。 编程思路可以是这样: 1.每次都是斜着按照右上方向或者左下方向,遍历输出一斜串数字,直至到达矩阵的边界; 2....
  • KINGHMY
  • KINGHMY
  • 2015年04月07日 18:44
  • 1084

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

void print_mat(int **mat, int mat_size)   {       int i, j;       cout     for(i = 0; i     {...
  • somksomk
  • somksomk
  • 2012年12月03日 19:45
  • 863

输入一个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 ...
  • muweiyou
  • muweiyou
  • 2012年01月05日 22:31
  • 1521
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)
举报原因:
原因补充:

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