碰到一个问题时,观察分析其中的规律,将这些重复的步骤总结出来,并设好终止条件, 然后用程序语言表达出来,就成了一种解决方案。
小题目: 回子型遍历矩阵, 示例:A B C K M N J H G D E F
A B C K
D E F M
G H J N
可以用程序模拟来模拟这个过程,打印出访问顺序。
从左到右: A B C K 上边界下移
从上到下: M N 右边界左移
从右到左: J H G 下边界上移
从下到上: G D 左边界右移
从左到右: E F
...
用坐标系来模拟一下这个就够了,假设左边界坐标为一,上边界坐标也为一
1 2 3 4
1 A B C K
2 D E F M
3 G H J N
#include <iostream>
int minX, maxX, minY, maxY;
void print(int x, int y)
{
std::cout << "("<< x << "," << y << ")" << std::endl;
}
int l2r()
{
if(minX > maxX){
return 0;
}
for(int j = minX;j <= maxX; j++){
print(j, minY);
}
return ++minY;
}
int t2b()
{
if(minY > maxY){
return 0;
}
for(int j = minY; j <= maxY; j++){
print(maxX, j);
}
return --maxX;
}
int r2l()
{
if(maxX < minX){
return 0;
}
for(int j = maxX; j >= minX; j--){
print(j, maxY);
}
return --maxY;
}
int b2t()
{
if(minY > maxY)
{
return 0;
}
for(int j = maxY; j >= minY; j--)
{
print(minX, j);
}
return ++minX;
}
void driver(int x, int y)
{
minX = minY = 1;
maxX = x;
maxY = y;
while(l2r() && t2b() && r2l() && b2t()){}
}
int main()
{
driver(4,3);
return 0;
}
结果如下:
(1,1)
(2,1)
(3,1)
(4,1)
(4,2)
(4,3)
(3,3)
(2,3)
(1,3)
(1,2)
(2,2)
(3,2)