顺时针打印矩阵
来源:互联网 发布:centos7 安装mysql 编辑:程序博客网 时间:2024/05/15 10:17
输入一个M*N矩阵,按照从外向里以顺时针的顺序依次为1,2,3,4,5,6,...........M*N。
如:4*4矩阵
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
思路:从四个方向上依次遍历,关键是判断哪些位置是已经存放的,哪些是还未放的,这里用0表示该处是空的,非0表示已经存放过。四个方向依次是: 向左(y++){0, 1}, 向下(x++){1,0}, 向右(y--){0, -1}, 向上(x--){-1, 0}。
#include <iostream>using namespace std;template<int R, int C>class SpinMatrix{private:int m_matrix[R][C];struct Offset{int dx;int dy;};bool valid(int x, int y);public:SpinMatrix();void run();void println();int rows();int columns();};template<int R, int C>SpinMatrix<R, C>::SpinMatrix(){for(int i=0; i < R; i++){for(int j=0; j < C; j++){m_matrix[i][j] = 0;}}}/*判断矩阵元素位置是有是有效位置*/template<int R, int C>bool SpinMatrix<R, C>::valid(int x, int y){bool ret = true;ret = ret && ( (0 <= x) && (x < R) ); //是否越界ret = ret && ( (0 <= y) && (y < C) );ret = ret && ( m_matrix[x][y] == 0 ); //是否元素位置已被占用return ret;}template<int R, int C>void SpinMatrix<R, C>::run(){/*四个方向,向左(y++),向下(x++),向右(y--),向上(x--)*/const Offset OFFSET[] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0}};const int OSLEN = sizeof(OFFSET) / sizeof(Offset);int cx = 0;int cy = 0;int cd = 0;int i = 1; //要放的值do{m_matrix[cx][cy] = i;/*如果元素位置是无效的,包括元素位置越界和访问已占用位置*/if( !valid( cx + OFFSET[cd].dx, cy + OFFSET[cd].dy) ){cd = (cd + 1) % OSLEN; //转向}cx += OFFSET[cd].dx;cy += OFFSET[cd].dy;i++;}while( i <= R*C );}template<int R, int C>void SpinMatrix<R, C>::println(){for(int i=0; i < R; i++){for(int j=0; j < C; j++){cout<<m_matrix[i][j]<<'\t';}cout<<endl;}cout<<endl;}template<int R, int C>int SpinMatrix<R, C>::rows(){return R;}template<int R, int C>int SpinMatrix<R, C>::columns(){return C;}int main(){SpinMatrix<5, 4> sm1;SpinMatrix<4, 3> sm2;cout<<sm1.rows()<<" * "<<sm1.columns()<<endl;sm1.run();sm1.println();cout<<sm2.rows()<<" * "<<sm2.columns()<<endl;sm2.run();sm2.println();return 0;}
0 0
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 矩阵顺时针打印
- 顺时针打印矩阵
- 顺时针打印矩阵[算法]
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 地产公司新建商业中心调研-调研内容
- 基本寄存器
- 浙大PAT 1007. 素数对猜想 (解题思路)
- 字符串旋转检测算法
- 编写高效的C#图像处理程序(4) Rgb=>Lab,C# vs. C++(VC)
- 顺时针打印矩阵
- fedora 14编译安卓内核
- 第二周作业
- jdbctemplate batchUpdate方法。
- pat 1071 Speech Patterns (25)
- mysql : Lock wait timeout exceeded; try restarting transaction
- java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index
- 浙大PAT 1008. 数组元素循环右移问题 (解题思路)
- 判断整数类型是否由不同整数构成