旋转打印矩阵、旋转存储矩阵、之字形打印矩阵
2015-12-04 12:24
351 查看
题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字。例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
有三问:
1)如何实现转圈打印矩阵?
2)如何实现顺时针旋转矩阵?
3)如何实现“之”字形打印矩阵?
题外话:
由于要打印输出矩阵,从题目可以看出,数字位数有变化,所以统一按最大位数输出,便于对齐。
使用位于头文件<iomanip>中的格式化函数 std::setw(int n); 来固定每次输出的位数。
1)先来实现转圈打印矩阵。我们以顺时针来转圈。
从整体上来把握。先定义一个打印一圈的函数,根据圈的左上角坐标和右下角坐标来确定圈的大小。
之后,定义顺时针打印函数。
测试函数及 输出结果如下所示:
![](https://img-blog.csdn.net/20151204134824073?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2)接下来,我们来实现 顺时针旋转矩阵。旋转后,矩阵中的内容发生变化。
采用的方法和第1)问的解法相似。先对一圈进行旋转,之后,缩小一圈,继续对内圈进行旋转。直至最后。
之后,从外圈向内圈 依次调用上面的这个函数。
下面是测试函数及结果
void printMatrix(int (*matrix)[4], int height, int width)
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
std::cout << std::setw(2) << matrix[i][j] << " ";
endl(std::cout);
}
}
int main(void)
{
int matrix[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
endl(std::cout << "Before Rotate: ");
printMatrix(matrix,4,4);
rotateMatrix(matrix,4,4);
endl(std::cout << "\nAfter Rotate: ");
printMatrix(matrix,4,4);
return 0;
}
![](https://img-blog.csdn.net/20151204150849202?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3)实现“之”字形打印矩阵
该问题的解决方案和上面依然很类似。
上面是先打印指定的一圈,该问题要先打印指定的一条斜线。
由于之字形打印是上下来回交替着打印,所以要定义一个bool变量来指示打印的方向。
void zigzagPrintLine(int (*matrix)[4], int leftX, int leftY, int rightX, int rightY, bool isFromBottom)
{
if(isFromBottom)
while(leftX >= rightX)
std::cout << matrix[leftX--][leftY++] << " ";
else
while(rightX <= leftX)
std::cout << matrix[rightX++][rightY--] << " ";
}
之后,依次调用该斜线函数
void zigzagPrintMatrix(int (*matrix)[4], int height, int width)
{
int leftX = 0, leftY = 0, rightX = 0, rightY = 0;
int endX = height - 1, endY = width - 1;
bool isFromBottom = true;
while(leftY <= endY && rightX <= endX)
{
zigzagPrintLine(matrix,leftX,leftY,rightX,rightY,isFromBottom);
if(++leftX > endX)
{
leftX = endX;
leftY++;
}
if(++rightY > endY)
{
rightY = endY;
rightX++;
}
isFromBottom = !isFromBottom;
}
}
下面是测试函数及打印结果
void printMatrix(int (*matrix)[4], int height, int width)
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
std::cout << std::setw(2) << matrix[i][j] << " ";
endl(std::cout);
}
}
int main(void)
{
int matrix[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
endl(std::cout << "Original Matrix: ");
printMatrix(matrix,4,4);
endl(std::cout << "=============");
endl(std::cout << "Zigzag output:");
zigzagPrintMatrix(matrix,4,4);
return 0;
}
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
有三问:
1)如何实现转圈打印矩阵?
2)如何实现顺时针旋转矩阵?
3)如何实现“之”字形打印矩阵?
题外话:
由于要打印输出矩阵,从题目可以看出,数字位数有变化,所以统一按最大位数输出,便于对齐。
使用位于头文件<iomanip>中的格式化函数 std::setw(int n); 来固定每次输出的位数。
1)先来实现转圈打印矩阵。我们以顺时针来转圈。
从整体上来把握。先定义一个打印一圈的函数,根据圈的左上角坐标和右下角坐标来确定圈的大小。
void printOneCircle(int(*matrix)[4], int leftTopX, int leftTopY, int rightBottomX, int rightBottomY) { //子矩阵只有一行时 if(leftTopX == rightBottomX) { for(int j = leftTopY; j <= rightBottomY; j++) std::cout << matrix[leftTopX][j] << " "; endl(std::cout); } //当子矩阵只有一列时 else if(leftTopY == rightBottomY) { for(int i = leftTopX; i <= rightBottomX; i++) std::cout << matrix[i][leftTopY] << " "; endl(std::cout); } else { int curX = leftTopX; int curY = leftTopY; while(curY != rightBottomY){ std::cout << matrix[curX][curY] << " "; curY++; } while(curX != rightBottomX){ std::cout << matrix[curX][curY] << " "; curX++; } while(curY != leftTopY){ std::cout << matrix[curX][curY] << " "; curY--; } while(curX != leftTopX){ std::cout << matrix[curX][curY] << " "; curX--; } } }
之后,定义顺时针打印函数。
void clockwisePrint(int(*matrix)[4], int Height, int width) { int leftTopX = 0, leftTopY = 0, rightBottomX = Height - 1, rightBottomY = width - 1; while(leftTopX <= rightBottomX && leftTopY <= rightBottomY) printOneCircle(matrix, leftTopX++, leftTopY++, rightBottomX--, rightBottomY--); }
测试函数及 输出结果如下所示:
int main(void) { int matrix[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; clockwisePrint(matrix,4,4); }
2)接下来,我们来实现 顺时针旋转矩阵。旋转后,矩阵中的内容发生变化。
采用的方法和第1)问的解法相似。先对一圈进行旋转,之后,缩小一圈,继续对内圈进行旋转。直至最后。
void clockwiseRotateMatrix(int (*matrix)[4], int leftTopX, int leftTopY, int rightBottomX, int rightBottomY) { int counter = rightBottomY - leftTopY; int temp = 0; //顺时针旋转90度 for(int i = 0; i < counter; i++) { temp = matrix[leftTopX][leftTopY+i]; matrix[leftTopX][leftTopY+i] = matrix[rightBottomX-i][leftTopY]; matrix[rightBottomX-i][leftTopY] = matrix[rightBottomX][rightBottomY-i]; matrix[rightBottomX][rightBottomY-i] = matrix[leftTopX+i][rightBottomY]; matrix[leftTopX+i][rightBottomY] = temp; } }
之后,从外圈向内圈 依次调用上面的这个函数。
void rotateMatrix(int (*matrix)[4], int height, int width) { int leftX = 0, leftY = 0, rightX = height - 1, rightY = width - 1; while(leftX < rightX) clockwiseRotateMatrix(matrix,leftX++,leftY++,rightX--,rightY--); }
下面是测试函数及结果
void printMatrix(int (*matrix)[4], int height, int width)
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
std::cout << std::setw(2) << matrix[i][j] << " ";
endl(std::cout);
}
}
int main(void)
{
int matrix[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
endl(std::cout << "Before Rotate: ");
printMatrix(matrix,4,4);
rotateMatrix(matrix,4,4);
endl(std::cout << "\nAfter Rotate: ");
printMatrix(matrix,4,4);
return 0;
}
3)实现“之”字形打印矩阵
该问题的解决方案和上面依然很类似。
上面是先打印指定的一圈,该问题要先打印指定的一条斜线。
由于之字形打印是上下来回交替着打印,所以要定义一个bool变量来指示打印的方向。
void zigzagPrintLine(int (*matrix)[4], int leftX, int leftY, int rightX, int rightY, bool isFromBottom)
{
if(isFromBottom)
while(leftX >= rightX)
std::cout << matrix[leftX--][leftY++] << " ";
else
while(rightX <= leftX)
std::cout << matrix[rightX++][rightY--] << " ";
}
之后,依次调用该斜线函数
void zigzagPrintMatrix(int (*matrix)[4], int height, int width)
{
int leftX = 0, leftY = 0, rightX = 0, rightY = 0;
int endX = height - 1, endY = width - 1;
bool isFromBottom = true;
while(leftY <= endY && rightX <= endX)
{
zigzagPrintLine(matrix,leftX,leftY,rightX,rightY,isFromBottom);
if(++leftX > endX)
{
leftX = endX;
leftY++;
}
if(++rightY > endY)
{
rightY = endY;
rightX++;
}
isFromBottom = !isFromBottom;
}
}
下面是测试函数及打印结果
void printMatrix(int (*matrix)[4], int height, int width)
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
std::cout << std::setw(2) << matrix[i][j] << " ";
endl(std::cout);
}
}
int main(void)
{
int matrix[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
endl(std::cout << "Original Matrix: ");
printMatrix(matrix,4,4);
endl(std::cout << "=============");
endl(std::cout << "Zigzag output:");
zigzagPrintMatrix(matrix,4,4);
return 0;
}
相关文章推荐
- 李祥对数值策划的定义
- Activemq+Zookeeper集群
- 关于MD5加密
- POJ 1066 Treasure Hunt
- 编程成长日记――求素数
- 服务中的自定义广播
- nfs服务器mount远程主机问题
- C实现MD5
- 前端知识整理---浏览器内核
- IOS 沙盒与清除缓存
- Android 图表 MPAndroidChart 的简单使用
- mysql unrecognized service问题解决
- iOS 打电话 发短信 邮件 打开网址 调用应用等合集
- 有关左值和右值,我的一些看法,可能不对,希望大神们指正!
- mac 安装phpredis扩展
- linux文件上传
- iOS 打电话、发短信、邮件、打开网址、调用应用等合集
- 手机防盗模块的实现
- 计蒜客—跳跃游戏二
- 状态栏的隐藏与显示