碰到一个问题时,观察分析其中的规律,将这些重复的步骤总结出来,并设好终止条件, 然后用程序语言表达出来,就成了一种解决方案。
小题目: 回子型遍历矩阵, 示例: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)