当前课程知识点:面向对象程序设计(C++) > 第五讲 找到对象,确定接口 > 5.4 实现接口 > Video
刚才我们这个旋转矩阵
从一个看起来很复杂的问题
让我们一层一层的往下抽茧剥丝一样
一层一层往下抽
现在就发现还剩一个什么问题呢
这个findposition
这个findposition这个玩意怎么实现的
那么我们下边我们来看怎么去实现的
其实这是一个有点算法性质的问题了
因为我们发现旋转矩阵嘛
那么你是这么一步一步往下走的
这个走的过程中
每一个数字实际上
都跟上一个数字是相邻的
别管是上面下面左面右面
反正是相邻
那么我可以根据上一个数字在哪
和当前我应该往哪边走了
运动方向来确定
这个数字应该放在什么地方
所以我们就应该存储一下
上一个数字在哪
还有当前该往哪走
就是运动方向这么两个信息
所以我们在这个matrix里边
增加了这么几个变量
一个是row和char
就是上一个数字的位置
还有一个是dir
这是当前运动方向
接下来我们看那个初始状态
大家注意啊
看我们这个图里面
我们刚开始的时候这个是往下走的
第一个数字出现在左上角
那么我们的初始位置应该在哪呢
我们从什么地方向下走一步
能够到这个方针的左上角呢
左上角是00
那么谁在00的上边啊
00的上边意味着什么
它的行比00还要小一级
比0还要小一级
那就是-1
0
那么我们初始化的时候
就把这个row初始化成-1
char初始化成0
dir呢
这个方向呢
初始化成向下
接下来我们就根据这个当前位置
和方向去来计算下一个位置在哪
其实我们看这段程序啊
它实际上是一个switch
case这么一个结构
根据什么switch呢
就是根据当前运动方向switch
如果当前运动方向是向下
那么我们判断
是不是row小于size-1是不是
在我的有效的这个矩阵范围之内
然后再来判断它下一个位置是不是0
如果不是0意味着
下一个位置已经填充了
那别管是该出界了
还是已经填充了
意味着我该拐弯了对吧
那么当我row小于size
而且下一个位置是0的时候
意味着下一个位置这是要被填充的
那么我们就把这个row++
向下走一格
否则的话就意味着我或者是要出界
或者是下一个位置
它下面这个已经被填充了
那么就意味着该拐弯了
那么我们就把这个方向给它拐一个弯
向下之后是向右
那好我们这个方向就由D变成了right
然后把这个col++
向右走一格
其他的实际上也类似
当我向右的时候判断是不是超界
是不是已经填充完了
如果是没有
那么好我向右走一格
如果是有那么我变成向上
再row--向上走一格
向上和向左的时候是同理
这样都做完了之后
我们最后就把这个
下一个位置
row乘以size加col把它反回去
就获得了下一个位置
应该在哪的一个信息
好然后我们把这个程序跑一下
测试一下我们看到这个测试结果
这是我们用一个10乘10的这种测试
我们看这个红线就看出来了
它确实是按这个
旋转的方式把它正确的填充
但是这个产品经理又来了
我们的需求又变了
怎么变了呢
填充方式变了
我们不再简简单单的是一个
顺时针的旋转填充
我们需要要求多种不同方式来填充
可以顺时针
也可以逆时针旋转
可以行优先填充
可以列优先填充
还有一些别的其他的填充形式
那么大家可以发现
在我们这个类里边
其实无论你
采用什么样的填充方式
我的修改都集中在了
这个findposition这个成员函数里边
换句话说别的地方都不用动
只要把这个findposition给它改了
我们的这个类就可以适应
多种不同方式的填充矩阵了
-1.0 课程定位、教学内容
-1.0 课程定位、教学内容--作业
-1.1 编程环境与工具
--源程序拆分
-1.2 main函数的命令行参数
-作业一--作业
-2.1 变量定义
--变量定义
-2.2 变量的初始化、类型推导与基于范围的循环
-2.3 函数重载
--函数重载
-2.4 函数参数的缺省值与追踪返回类型的函数
-2.5 类的定义
--类的定义
-2.6 类成员的访问权限与友元
-第二讲 基础语法(1)--作业二
-3.1 构造函数析构函数
--构造函数析构函数
-3.2 赋值运算符重载
--赋值运算符重载
-3.3 流运算符重载
--流运算符重载
-3.4 函数运算符重载
--函数运算符重载
-3.5 下标运算符与自增减运算符重载
-3.6 静态成员与常量成员
-3.7 对象组合
--对象组合
-3.8 移动构造函数
--Video
--Video
-3.9 default修饰符
--Video
-第三讲 基础语法(2)--作业三
-4.1 继承
--Video
-4.2 函数重写
--Video
-4.3 虚函数
--Video
--Video
-4.4 自动类型转换
--Video
-4.5 禁止自动类型转换
--Video
-4.6 强制类型转换
--Video
-4.7 函数模板
--Video
-4.8 类模板
--Video
-4.9 成员函数模板
--Video
-4.10 模板特化
--Video
-作业四--作业
-5.0 引言
--Video
-5.1 从FOP到OOP
--Video
-5.2 对象在哪里
--Video
-5.3 接口在哪儿
--Video
-5.4 实现接口
--Video
-5.5 变与不变:多态的威力
--Video
-6.0 引言
--讨论
-6.1 从负载监视器的设计开始
-6.2 接口的分离与单一责任原则
-6.3 委托与接口的进一步分解
-6.4 分离不同层面的可变性
-7.0 引言
--Video
-7.1 迭代器
--Video
-7.2 迭代器的实现
--Video
-7.3 迭代器与模板
--Video
-7.4 算法与数据的解耦
--Video
-7.5 抽象结构与类模板
--Video
-7.6 函数对象与算法分解
--Video
-7.7 基于模板的策略模式
--Video
-8.0 引言
--Video
-8.1 已有资源的组合
--Video
-8.2 适当引入接口
--Video
-8.3 接口不变时的功能变化
--Video
-8.4 装饰
--Video
-8.5 责任的传递与责任链
--Video
-8.X 小结
--Video
-9.0 引言
--Video
-9.1 通过封装增加隔离、应对变化
--Video
--Video
-9.2 增加抽象层,应对变化
--Video
--Video
-9.3 相互关联对象的创建
--Video
-9.4 示例:自动组卷系统设计
--Video
-9.5 设计思路(上)
--Video
-9.6 设计思路(中)
--Video
-9.7 设计思路(下)
--Video
-9.X 小结
--Video
-课程总结
--Video
-期末考试--作业