Problem:
“之”字形打印矩阵【题目】 给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵, 例如: 1 2 3 4 5 6 7 8 9 10 11 12 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12 【要求】 额外空间复杂度为O(1)Solution:
使用A,B两个坐标,初始值为(0,0),(0,0),A,B的连线为之字形的斜线 A移动方向为向右走,B移动方向为向下走,A到最右边了就向下走,B到最下面了就向右走 使用一个bool值,判断是向右上方方向遍历A-B直线,还是向左下角方向遍历A-B直线 A | B- 1 2 3 4 5 6 7 8 9 1 0 5
Code:
1 #include2 3 using namespace std; 4 5 template 6 void ZiPrint(const T arr, const int x, const int y) 7 { 8 int Ax = 0, Ay = 0;//初始化A,B的坐标 9 int Bx = 0, By = 0;10 bool flag = true;//true为右上方方向遍历, false为左下角方向遍历11 12 while (Ax <= x-1 && Ay <= y-1)//A到右下角就遍历完毕13 {14 if(flag)//右上方方向遍历15 {16 int Tx = Bx, Ty = By;17 while (Tx >= Ax || Ty <= Ay)18 {19 cout << arr[Tx][Ty] << " ";20 Tx -= 1;21 Ty += 1;22 }23 flag = false;24 }25 else//向左下角方向遍历26 {27 int Tx = Ax, Ty = Ay;28 while (Tx <= Bx || Ty >= By)29 {30 cout << arr[Tx][Ty] << " ";31 Tx += 1;32 Ty -= 1;33 }34 flag = true;35 }36 //更新A,B37 if (Ay < y - 1)38 Ay += 1;39 else40 Ax += 1;41 42 if (Bx < x - 1)43 Bx += 1;44 else45 By += 1;46 47 }48 cout << endl;49 50 }51 52 void Test()53 {54 int aa[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };55 ZiPrint(aa, 3, 4);56 }