打印蛇形矩阵
2016-09-02 10:58
253 查看
题目描述:编写一个函数,参数为一个整数N,返回一个N*N二维矩阵,这个矩阵的特点是左上角值为1,顺时针旋转缠绕从1到N*N。
例如:输入一个整数5
输出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
做法:
定义一个for循环,每次开始都向里走一层,开始节点是i,j,那结束条件为 i < N - i && j < N - j,每次循环i+1,j+1。
循环内部有四个if条件,if条件低下有一个while循环,依次填充矩阵元素。
第一个if语句,判断能不能向右走,那么判断条件就为指向最后一个元素的下一个下标 减去 指向最前边元素的下标,判断前后之中右没有元素,若有,即 大于零,则开始循环不断向右走来填充矩阵元素。当下标指向了最后一个元素的下一个下标,则表示走到头了,这时候跳出循环。需要注意,跳出循环后,当前下标的列要后退一格,行要向下走一格,以为右上角已经有值了。
第二个if语句判断能不能向下走,需要判断当前列指向最后一个元素的下一个元素 - 指向第一个元素中间是否还有元素,若有,while循环开始往下走。跳出循环,需要向上退一格,向左走一格。
第三个if语句,要判断能不能向左走,这里需要注意,若能走下边,则说明行和列都有元素。并且需要注意:这里判断语句要有等于好,因为可以走到未走过的元素的最顶头。
第四个if语句,是要判断能不能往上走,往上走的条件是行列都能走,也就是行列都有元素。但这里不能走到顶头,因为顶头已将在向右走的时候赋过值了。
代码如下:
若有错误之处,敬请指正。
例如:输入一个整数5
输出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
做法:
定义一个for循环,每次开始都向里走一层,开始节点是i,j,那结束条件为 i < N - i && j < N - j,每次循环i+1,j+1。
循环内部有四个if条件,if条件低下有一个while循环,依次填充矩阵元素。
第一个if语句,判断能不能向右走,那么判断条件就为指向最后一个元素的下一个下标 减去 指向最前边元素的下标,判断前后之中右没有元素,若有,即 大于零,则开始循环不断向右走来填充矩阵元素。当下标指向了最后一个元素的下一个下标,则表示走到头了,这时候跳出循环。需要注意,跳出循环后,当前下标的列要后退一格,行要向下走一格,以为右上角已经有值了。
第二个if语句判断能不能向下走,需要判断当前列指向最后一个元素的下一个元素 - 指向第一个元素中间是否还有元素,若有,while循环开始往下走。跳出循环,需要向上退一格,向左走一格。
第三个if语句,要判断能不能向左走,这里需要注意,若能走下边,则说明行和列都有元素。并且需要注意:这里判断语句要有等于好,因为可以走到未走过的元素的最顶头。
第四个if语句,是要判断能不能往上走,往上走的条件是行列都能走,也就是行列都有元素。但这里不能走到顶头,因为顶头已将在向右走的时候赋过值了。
代码如下:
# include <iostream> # include <vector> using namespace std; vector<vector<int> > getSnakeMatrix(int N) { vector<vector<int> > matrix(N, vector<int>(N)); if (N <= 0) return matrix; int cnt = 0; for (int i = 0, j = 0; i < N - i && j < N - i; ++i, ++j) { int m = i, n = j; if ( N - j - j > 0 ) { while ( n < N - j) { matrix[m][n++] = ++cnt; } } n--; m++; if ( N - i - i > 0) { while ( m < N - i) { matrix[m++] = ++cnt; } } m --; n --; if ( N - j - j > 0 && N - i - i > 0) { while ( n >= j) { matrix[m][n--] = ++cnt; } } n ++; m --; if (N - i - i > 0 && N - j - j > 0) { while ( m > i) { matrix[m--] = ++cnt; } } } return matrix; } void printMatrix(vector<vector<int> > &matrix) { for (unsigned int i = 0; i < matrix.size(); ++i) { for (unsigned int j = 0; j < matrix[i].size(); ++j) { cout << matrix[i][j] << '\t'; } cout << endl; } } int main(void) { vector<vector<int> > matrix; int N; cout << "please input N: "; cin >> N; matrix = getSnakeMatrix(N); printMatrix(matrix); return 0; }
若有错误之处,敬请指正。