旋转数组

描述:

某个图像通过一个整数组成的m*n矩阵表示,其中每个整数表示一个像素值。写出一种方法,根据flag变量的值将图像向右或者向左旋转90°。如果flag值为0,则向左旋转,如果flag为1,则向右旋转。

函数rotatePictureMethod的输入分别由矩阵matrix、矩阵的维度m和n以及flag的值组成。

函数应返回一个指向二维矩阵指针,该矩阵是按照flag值旋转后的结果矩阵而动态分配的。

示例:

如果标志flag=1且m=3,n=3,

输入矩阵

1   2   3

4   5   6

7   8   9

输出矩阵

7   4   1

8   5   2

9   6   3

思路:

逆时针旋转:

1 交换主对角线对称的元素;

2 交换第i行和第n-1-i行;

顺时针旋转:

1 交换副对角线对称的元素;

2 交换第i行和第n-1-i行;

原图:           第一步操作后:   第二步操作后:

C++代码:

#include <iostream>
using namespace std; void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
} // 逆时针旋转
void transpose(int a[][], int n)
{
for (int i = ; i < n; i++)
for (int j = i+; j < n; j++)
swap(a[i][j], a[j][i]);
for (int i = ; i < n / ; i++)
for (int j = ; j < n; j++)
swap(a[i][j], a[n - - i][j]);
} // 顺时针旋转
void clockwise(int a[][], int n)
{
for (int i = ; i < n; i++)
for (int j = ; j < n - i; j++)
swap(a[i][j], a[n - - j][n - - i]);
for (int i = ; i < n / ; i++)
for (int j = ; j < n; j++)
swap(a[i][j], a[n - - i][j]);
} int main(int argc, char** argv)
{
int a[][] = {
{, , , },
{, , , },
{, , , },
{, , , }
};
cout << "原矩阵" << endl;
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j)
cout << a[i][j] << " ";
cout << endl;
}
cout << endl;
transpose(a, );
cout << "逆时针转90度" << endl;
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j)
cout << a[i][j] << " ";
cout << endl;
}
cout << endl; int a2[][] = {
{, , , },
{, , , },
{, , , },
{, , , }
};
cout << "原矩阵" << endl;
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j)
cout << a2[i][j] << " ";
cout << endl;
}
clockwise(a2, );
cout << endl;
cout << "顺时针转90度" << endl;
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j)
cout << a2[i][j] << " ";
cout << endl;
} return ;
}

打印一个有规律的矩阵

描述:

给定一个整数n,以下列方式打印n行。

如果n=4,生成的排列将为:

1*2*3*4

9*10*11*12

13*14*15*16

5*6*7*8

函数squarePatternPrint的输入应包括一个整数n(假设0<=n<=100)。不要从函数返回任何内容。使用cout打印所需的阵列。

各输出行只能由“数字”和“*”组成,不应有空格。

有用的命令:cout可将内容打印到屏幕上。

思路:

如果n为偶数,就打印n/2行,如果n为奇数,就打印n/2+1行;

以n=4举例,先打印1*2*3*4,把5压进栈,5+n = 9,打印9*10*11*12,把13压进栈,此时从栈顶读取13,打印13*14*15*16,弹出栈顶元素13,继续从栈顶读取5,打印5*6*7*8,判断此时栈内为空,end.

这种思路有些繁琐,我觉得肯定有更好的思路,只是我没想起来,如果你有更好的思路,欢迎评论!

C++代码:

#include <iostream>
#include <stack>
using namespace std; void sprint(int n)
{
stack<int> nums;
int i = , j = , flag = ;
if (n % == )
flag = n / ;
else
flag = n / + ;
for (; i <= flag; i++)
{
for (int k = ; k < n; k++)
{
if (j % n == ) cout << j;
else cout << j << "*";
j++;
}
nums.push(j);
j = j + n;
cout << endl;
}
if (n % != )
nums.pop();
while (!nums.empty())
{
int top = nums.top();
nums.pop();
for (int k = ; k < n; k++)
{
if (top % n == ) cout << top;
else cout << top << "*";
top++;
}
cout << endl;
}
} int main()
{
sprint();
}

参考:

http://www.voidcn.com/article/p-wusaguhx-bbb.html

https://blog.csdn.net/qq_26525215/article/details/52076488

C++之旋转矩阵和打印一个有规律的矩阵的更多相关文章

  1. js快速打印一个五分制(五颗星)的评分情况

    1.函数 下面这个函数实现了在html页面中快速打印一个五分制(五颗星)的评分情况: function getRating(rating) { if(rating > 5 || rating & ...

  2. excel表格中打开可以显示整个表格但是打印却只能打印一个单元格

    excel表格中打开可以显示整个表格但是打印却只能打印一个单元格 如下图显示 解决办法 2007 版菜单栏上 ----->页面布局----->打印区域----->取消打印.即可正常. ...

  3. 每隔10秒钟打印一个“Helloworld”

    /** * 每隔10秒钟打印一个“Helloworld” */ public class Test03 { public static void main(String[] args) throws ...

  4. 检索并打印一个DNS主机条目

    检索并打印一个DNS主机条目的 C 程序 --- Linux/Unix /*************************************************************** ...

  5. python3 练习题100例 (二十五)打印一个n层金字塔

    题目内容: 打印一个n层(1<n<20)金字塔,金字塔由“+”构成,塔尖是1个“+”,下一层是3个“+”,居中排列,以此类推. 注意:每一行的+号之后均无空格,最后一行没有空格. 输入格式 ...

  6. java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz.

    需求:编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz. package study01; public cla ...

  7. 通过原生JS打印一个空心菱形图案

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 如何优雅地打印一个Java对象?

    你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下). 在一个月黑风高的夜晚,我思前想后,觉得再也不能 ...

  9. 使用那各VUE的打印功能(print.js)出现多打印一个空白页的问题

    最近这段时间,用VUE写东西,有个打印功能. 百度了一下,铺天盖地的VUE打印的两种实现方法. 很感激这些千篇一律的帖子,虽然不知道他们是否真的用过,还是只是复制粘贴. 至少这些帖子告诉我,是有两个可 ...

随机推荐

  1. redis报错解决

    1.Connecting to node 127.0.0.17000 [ERR] Sorry, can't connect to node 192.168.1.917000 redis集群:Conne ...

  2. uni-app 实现热更新

    前端打包 app 即把写好的静态资源文件套壳打包成 app ,而热更新即下载并替换 app 内部的静态资源文件,实现 app 的版本升级. 在uni-app 中,我们是如何实现热更新的呢?下面来看代码 ...

  3. ASP.NET Core 入门笔记4,ASP.NET Core MVC路由入门

    敲了一部分,懒得全部敲完,直接复制大佬的博客了,如有侵权,请通知我尽快删除修改 摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc ...

  4. VS2019 安装并破解 DevExpress 19.2 插件

    0.写在最前 本人vs版本为:     1.下载DevExpress 最新版本插件程序 官网下载试用30天地址: https://www.devexpress.com/products/net/con ...

  5. eclipse 建立Maven java工程

    1.在项目资源管理器右键---新建---项目 2.在选择向导里选择Maven---Maven Project 3.选择默认的工作空间,下一步 4.选择箭头所示选项 5.输入组织名和工程名.点击完成

  6. 实习第一个月总结(const关键字、条件编译、volatile关键字、#和##的作用、函数指针)

    C语言中const关键字的作用: 修饰局部变量或者全局变量,表示变量n的值不能被改变了 修饰指针,分为常量指针与指针常量,也可以两者结合 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变, ...

  7. linux 软连接和 硬链接的区别

    Linux软链接硬链接的区别   ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下 ...

  8. Docker——入门

    虚拟化最大区别:虚拟化技术元件,资源申请调度到其他硬件服务器: Docker是一个开源得应用容器引擎,让开发者可以打包他们得应用以及依赖包到一共可移植得容器中,然后发布到任何流行得linux机器上,也 ...

  9. 关于win10安卓真机调试无法找到设备的问题

    之前在win10系统上调试安卓设备,usb接好了,结果居然没有找到设备. 一般出现这种情况可能是电脑的驱动没装好. 于是找了驱动人生大佬来诊断,确实是少了安卓usb驱动. 正常来说用驱动人生装个usb ...

  10. linux常用的bash指令

    文本处理 awk sed grep sort uniq cat cut echo fmt tr nl egrep fgrep wc 进程监视 ps top htop atop lsof 网络 nmap ...