简单模拟算法

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 

最终运行情况如下:

技术图片

以上是关于简单模拟算法的主要内容,如果未能解决你的问题,请参考以下文章

胡凡 《算法笔记》 上机实战训练指南 3.1 简单模拟

2017级算法模拟上机准备篇

c_cpp 用于简单内存分配算法的模拟器

TF-IDF算法介绍,简单模拟,以及在图数据中应用

TF-IDF算法介绍,简单模拟,以及在图数据中应用

TF-IDF算法介绍,简单模拟,以及在图数据中应用