• 简单模拟算法(1)


    使用过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("
    ");
    7     }
    8 }

    定义好了上面这些函数后,只需要在主函数中依次调用它们即可:

    1 int main()
    2 {
    3     scanf("%d", &m_size);
    4     run(0, 0);
    5     display();
    6     return 0;
    7 }

    最终运行情况如下:

  • 相关阅读:
    数据结构 【实验 串的基本操作】
    Ioc容器依赖注入-Spring 源码系列(2)
    定时任务管理中心(dubbo+spring)-我们到底能走多远系列47
    jvm内存增长问题排查简例
    Ioc容器beanDefinition-Spring 源码系列(1)
    SPI机制
    java工厂-积木系列
    java单例-积木系列
    利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
    java 静态代理-积木系列
  • 原文地址:https://www.cnblogs.com/viewts/p/11070314.html
Copyright © 2020-2023  润新知