使用过python的pyautogui库的应该都知道官方文档有一个这样的例子:
源码如下:
1 import pyautogui 2 3 distance = 200 4 while distance > 0: 5 pyautogui.dragRel(distance, 0, duration = 0.5) #右 6 distance -= 10 7 pyautogui.dragRel(0, distance, duration = 0.5) #下 8 pyautogui.dragRel(-distance, 0, duration = 0.5) #左 9 distance -= 10 10 pyautogui.dragRel(0, -distance, duration = 0.5) #上
这就类似于一个矩阵遍历方式,类似与我们所熟悉的深度优先搜索,在进入矩阵的时候一直贴着一边的墙壁运动,那么如何用c++来实现这样的一个算法呢?
首先定义一个矩阵来容纳这个区域:
1 const int maxn = 50; 2 int M[maxn][maxn] = {0}; 3 int m_size = 1;
矩阵的最大范围是50*50,当然用vector<int>也行,矩阵默认大小为1。接着,需要定义一下搜索的方向,这里的顺序是右→下→左→上:
1 const int array_x[] = {0, 1, 0, -1}; 2 const int array_y[] = {1, 0, -1, 0}; 3 int dir = 0;
定义了两个方向向量,然后是用一个dir来表示当前前进的方向。当然,在矩阵中需要判断位置是否合适,我们默认数值0表示该位置还未走过:
1 bool check(int x, int y) { 2 if (x < 0 || x >= m_size || y < 0 || y >= m_size) { 3 return false; 4 } 5 if (M[x][y] > 0) { 6 return false; 7 } 8 return true; 9 }
最后,来定义一下在矩阵中行走的方法:
1 void run(int x, int y, int step = 1) { 2 if (check(x, y)) { 3 M[x][y] = step; 4 if (!check(x + array_x[dir], y + array_y[dir])) { 5 dir = (dir + 1) % 4; 6 } 7 run(x + array_x[dir], y + array_y[dir], step + 1); 8 } 9 }
从上面可以看出,每次走到矩阵的边缘的尽头时转换方向,如果下一个方向可以走就继续递归下去。为了方便查看矩阵行走的情况,来专门定义一个显示函数:
1 void display() { 2 for (int i = 0; i < m_size; i++) { 3 for (int j = 0; j < m_size; j++) { 4 printf("%-3d", M[i][j]); 5 } 6 printf("\n"); 7 } 8 }
定义好了上面这些函数后,只需要在主函数中依次调用它们即可:
1 int main() 2 { 3 scanf("%d", &m_size); 4 run(0, 0); 5 display(); 6 return 0; 7 }
最终运行情况如下:
原文地址:https://www.cnblogs.com/viewts/p/11070314.html
时间: 2024-09-30 21:38:23