简单模拟算法(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("\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

简单模拟算法(1)的相关文章

HDU-1034-Candy Sharing Game(C++ &amp;&amp; 简单模拟)

Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3703    Accepted Submission(s): 2311 Problem Description A number of students sit in a circle facing their teacher in the cent

简单线性回归算法

/**  * 简单线性回归算法  * @param array y轴数据  * @param array x轴数据  * @returns array(slope,intercept,r2)  */ function linearRegression(y, x) {     var lr = {};     var n = y.length;     var sum_x = 0;     var sum_y = 0;     var sum_xy = 0;     var sum_xx = 0;

Jquery源码分析与简单模拟实现

前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1.jQuery为什么能使用$的方式调用,$是什么.$()又是什么.链式调用如何实现的 2.jQuery的类级别的扩展内部是怎样实现的,方法级别的扩展有是怎样实现的,$.fn又是什么 3.jQuery选择器是如何执行的,又是如何将结果包装并返回的 带着这些问题,我们进行jquery的模拟实现,文章下方有

Linux 内核 链表 的简单模拟(2)

接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) for (pos = (head)->next; pos != (head);

HDU 1048 What Is Your Grade? (简单模拟)

 What Is Your Grade? Problem Description "Point, point, life of student!" This is a ballad(歌谣)well known in colleges, and you must care about your score in this exam too. How many points can you get? Now, I told you the rules which are used in

JavaWeb学习总结(四十九)——简单模拟Sping MVC

在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: 1 /** 2 * 使用Controller注解标注LoginUI类 3 */ 4 @Controller 5 public class LoginUI { 6 7 //使用RequestMapping注解指明forward1方法的访问路径 8 @RequestMapping("LoginUI/Lo

模拟算法_掷骰子游戏&amp;&amp;猜数游戏

模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数. 先来介绍一下随机数的生成: 1.产生不定范围的随机数 函数原型:int rand() 产生一个介于0~RAD_MAX间的整数,其具体值与系统有关系.Linux下为2147483647.我们可以在include文件夹中的stdlib.h中可以看到(Linux在usr目录下,Windows在安装目录下) 1 #include<stdio.h> 2 #include<stdlib

简单模拟Hibernate的主要功能实现

在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解**********************/1.实体类User:public class User {    private int id;    private String username;    private String password; public int getId() {       

数据结构与算法之模拟算法 C++实现

模拟算法:模拟整个过程,通过改变数学中模型的各种参数,进而观察变更这些参数所引起过程状态的变化. 算法思路:使用随机函数来模拟自然界中发生的不可预测情况.(srand() 和 rand()函数生成随机数) 模拟算法也就是将整个过程完完整整的走一遍,题目怎么叙述的,程序就怎么运行. 实例一:猜数字 计算机随机生成一个1-100的整数,用户猜测,每次猜测给出不同的提示. 代码: #include <iostream> #include <stdlib.h> #include <t