简单模拟算法
Posted viewts
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单模拟算法相关的知识,希望对你有一定的参考价值。
使用过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
最终运行情况如下:
以上是关于简单模拟算法的主要内容,如果未能解决你的问题,请参考以下文章