最近在听牛客网左老师的算法视频课,对算法更感兴趣了,并且希望自己的算法能力有所提高,于是计划把题目编一编,锻炼代码实现能力。
本次的代码是转圈打印和“之”字打印,两道题的基本思路是一致的,主要锻炼的是代码实现技巧。在转圈打印中,通过左上点和右下点就能标记出一个矩阵;“之”字打印中,对于左边变化的判断是需要熟练的。
1.转圈打印矩阵
#include "Array_matrix8_1.h"#include "iostream"using namespace std;#define N 4#define M 4Array_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%20"Array_matrix8_3.h"#include%20"iostream"using%20namespace%20std;#define%20N%204#define%20M%204Array_matrix8_3::Array_matrix8_3(){%20%20%20%20//ctor}Array_matrix8_3::~Array_matrix8_3(){%20%20%20%20//dtor}void%20print_level(int%20ma[N][M],int%20ro1,int%20ro2,int%20co1,int%20co2,bool%20fl){%20%20%20%20if(fl){%20%20%20%20%20%20%20%20while(ro1!=ro2+1){%20%20%20%20%20%20%20%20%20%20%20%20cout<<ma[ro1++][co1--]<<"%20";%20%20%20%20%20%20%20%20}%20%20%20%20}else{%20%20%20%20%20%20%20%20while(ro2!=ro1-1){%20%20%20%20%20%20%20%20%20%20%20%20cout<<ma[ro2--][co2++]<<"%20";%20%20%20%20%20%20%20%20}%20%20%20%20}}void%20Zhizi_Print(int%20mat[N][M]){%20%20int%20row1=0;%20%20//(row1,col1)横向走的坐标%20%20%20(row2,col2)纵向走的坐标%20%20int%20row2=0;%20%20int%20col1=0;%20%20int%20col2=0;%20%20int%20endrow=N-1;%20%20int%20endcol=M-1;%20%20bool%20flag=false;%20%20while(row1!=endrow+1){%20%20%20%20print_level(mat,row1,row2,col1,col2,flag);%20%20%20%20row1=%20col1==endcol%20?%20row1+1:row1;%20%20%20%20%20%20%20//如果走到的最后一列横坐标加1%20%20%20%20col1=%20col1==endcol%20?%20col1%20%20:col1+1;%20%20%20%20%20//如果没有走到最后一列纵坐标加1%20%20%20%20col2=%20row2==endrow%20?%20col2+1:col2;%20%20%20%20row2=%20row2==endrow%20?%20row2%20%20:row2+1;%20%20%20%20flag=%20!flag;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//flag==true%20:右上%20->左下,flag==false%20:左下%20->右上%20%20}}int%20main(){%20%20%20%20int%20matrix[N][M]={%20{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};%20%20%20%20Zhizi_Print(matrix);%20%20%20%20return%200;
新闻热点
疑难解答