本次的代码是转圈打印和“之”字打印,两道题的基本思路是一致的,主要锻炼的是代码实现技巧。在转圈打印中,通过左上点和右下点就能标记出一个矩阵;“之”字打印中,对于左边变化的判断是需要熟练的。
1.转圈打印矩阵
#include "Array_matrix8_1.h"
#include "iostream"
using namespace std;
#define N 4
#define M 4
Array_matrix8_1::Array_matrix8_1()
{
//ctor
}
Array_matrix8_1::~Array_matrix8_1()
{
//dtor
}
/*
不要纠结于坐标怎么上下左右动
4个变量标记一个矩阵,4个while循环
*/
void printEdge(int mat1[N][M],int ro1,int ro2,int co1,int co2)
{
int cur1=co1;
int cur2=ro1;
while(cur1!=co2){ //***可直接用“!=”减少多余的考虑
cout<<mat1[ro1][cur1]<<" ";
cur1++;
}
while(cur2!=ro2){
cout<<mat1[cur2][co2]<<" ";
cur2++;
}
while(cur1!=co1){
cout<<mat1[ro2][cur1]<<" ";
cur1--;
}
while(cur2!=ro1){
cout<<mat1[cur2][co1]<<" ";
cur2--;
}
}
void spiralOrderPrint(int mat[N][M])
{
int row1=0; //左上点的横坐标
int row2=N-1; //右下点的横坐标
int col1=0;
int col2=M-1;
while(row1<=row2&&col1<=col2)
{
// printEdge(mat,row1++,row2--,col1++,col2--);
printEdge(mat,row1,row2,col1,col2);
row1++;
row2--;
col1++;
col2--;
}
}
int main()
{
int matrix[N][M]={1,2,3,4,5,6,7,8,4,3,2,1,8,7,6,5};
spiralOrderPrint(matrix);
return 0;
}
2.“之”字打印
#include "Array_matrix8_3.h"
#include "iostream"
using namespace std;
#define N 4
#define M 4
Array_matrix8_3::Array_matrix8_3()
{
//ctor
}
Array_matrix8_3::~Array_matrix8_3()
{
//dtor
}
void print_level(int ma[N][M],int ro1,int ro2,int co1,int co2,bool fl){
if(fl){
while(ro1!=ro2+1){
cout<<ma[ro1++][co1--]<<" ";
}
}else{
while(ro2!=ro1-1){
cout<<ma[ro2--][co2++]<<" ";
}
}
}
void Zhizi_Print(int mat[N][M])
{
int row1=0; //(row1,col1)横向走的坐标 (row2,col2)纵向走的坐标
int row2=0;
int col1=0;
int col2=0;
int endrow=N-1;
int endcol=M-1;
bool flag=false;
while(row1!=endrow+1){
print_level(mat,row1,row2,col1,col2,flag);
row1= col1==endcol ? row1+1:row1; //如果走到的最后一列横坐标加1
col1= col1==endcol ? col1 :col1+1; //如果没有走到最后一列纵坐标加1
col2= row2==endrow ? col2+1:col2;
row2= row2==endrow ? row2 :row2+1;
flag= !flag; //flag==true :右上 ->左下,flag==false :左下 ->右上
}
}
int main()
{
int matrix[N][M]={ {1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
Zhizi_Print(matrix);
return 0;