您的位置:首页 > 其它

打印蛇形矩阵

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语句,是要判断能不能往上走,往上走的条件是行列都能走,也就是行列都有元素。但这里不能走到顶头,因为顶头已将在向右走的时候赋过值了。

代码如下:

# 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;
}


若有错误之处,敬请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息