首页 > 编程语言 >常见算法

常见算法

时间:2023-05-13 11:12:05浏览次数:31  
标签:Wall currentPos 常见 pos 算法 col Road row

寻路

  深度

    四个方向,依次寻找,入栈,都走完了就出栈回退

    

  1 #include <iostream>
  2 using namespace std;
  3 
  4 #include <graphics.h>
  5 
  6 #include "MyStack.h"
  7 
  8 //格子宽高
  9 #define SPACE   80
 10 
 11 
 12 //Y   竖着
 13 #define ROWS  10
 14 //X   横着
 15 #define COLS  10
 16 //             路    墙
 17 enum states{ Road,Wall };
 18 //试探方向
 19 enum direct{p_up,p_down,p_left,p_right};
 20 
 21 class MyPoint{
 22 public:
 23     int row, col;
 24     friend bool operator==(const MyPoint& p1, const MyPoint& p2);
 25 };
 26 
 27 bool operator==(const MyPoint& p1, const MyPoint& p2){
 28     if ((p1.row == p2.row) && (p1.col == p2.col) ) return true;
 29     return false;
 30 }
 31 
 32 class PathNode{
 33 public:
 34     //states        val;    //地图上的值
 35     direct        dir;        //当前试探方向
 36     bool        isFind;        //是否走过
 37 };
 38 
 39 
 40 
 41 //图片变量
 42 IMAGE pos, ren, road, wall;
 43 
 44 
 45 void printMap(int map[ROWS][COLS], MyPoint pos);
 46 void drawMap(int map[ROWS][COLS],MyPoint pos);
 47 
 48 int main(){
 49     initgraph(SPACE*COLS, SPACE*ROWS,SHOWCONSOLE);
 50     loadimage(&road, "road.bmp", SPACE, SPACE, true);
 51     loadimage(&wall, "wall.bmp", SPACE, SPACE, true);
 52     loadimage(&ren, "ren.bmp", SPACE, SPACE, true);
 53     loadimage(&pos, "pos.bmp", SPACE/2, SPACE/2, true);
 54     //地图
 55     int map[ROWS][COLS] = {
 56         { Wall, Wall, Wall, Wall, Wall, Wall, Wall, Wall, Wall, Wall },
 57         { Wall, Road, Wall, Road, Road, Wall, Wall, Road, Road, Wall },
 58         { Wall, Road, Wall, Road, Wall, Wall, Wall, Road, Wall, Wall },
 59         { Wall, Road, Wall, Road, Road, Road, Wall, Road, Wall, Wall },
 60         { Wall, Road, Road, Road, Wall, Road, Wall, Road, Wall, Wall },
 61         { Wall, Road, Wall, Wall, Wall, Road, Wall, Road, Wall, Wall },
 62         { Wall, Road, Wall, Wall, Wall, Road, Road, Road, Road, Wall },
 63         { Wall, Road, Wall, Road, Road, Road, Wall, Road, Wall, Wall },
 64         { Wall, Road, Wall, Road, Wall, Road, Wall, Road, Road, Wall },
 65         { Wall, Wall, Wall, Wall, Wall, Wall, Wall, Wall, Wall, Wall }
 66     };
 67     //辅助地图  
 68     PathNode pathMap[ROWS][COLS] = { p_up };
 69     /*
 70     for (int i = 0; i < ROWS; i++){
 71         for (int j = 0; j < COLS; j++){
 72             pathMap[i][j] = map[i][j];
 73         }
 74     }
 75     */
 76     MyPoint begPos = { 1, 1 };//起点 
 77     MyPoint endPos = { 8, 8 };//终点
 78 
 79     //准备一个栈
 80     MyStack<MyPoint> stack;
 81     //起点标记走过
 82     pathMap[begPos.row][begPos.col].isFind = true;
 83     //起点入栈
 84     stack.push(begPos);
 85 
 86     //当前点
 87     MyPoint currentPos = begPos;
 88     //试探点
 89     MyPoint searchPos;
 90     //是否找到终点
 91     bool isFindEnd = false;
 92     //循环寻路
 93     while (1){
 94         
 95         searchPos = currentPos;
 96         switch (pathMap[currentPos.row][currentPos.col].dir){
 97         case p_up:
 98             searchPos.row--;//1 找到试探点
 99             //2 判断是否能走
100             //试探方向改变
101             pathMap[currentPos.row][currentPos.col].dir = p_down;
102             if (pathMap[searchPos.row][searchPos.col].isFind == false &&//没有走过
103                 map[searchPos.row][searchPos.col] == Road){//是路 可以走
104                 //2.1 能走   
105                 currentPos = searchPos;//走  
106                 pathMap[currentPos.row][currentPos.col].isFind = true;//标记走过 
107                 stack.push(currentPos);//入栈
108             }
109             break;
110         case p_down:
111             searchPos.row++;//1 找到试探点
112             //2 判断是否能走
113             //试探方向改变
114             pathMap[currentPos.row][currentPos.col].dir = p_left;
115             if (pathMap[searchPos.row][searchPos.col].isFind == false &&//没有走过
116                 map[searchPos.row][searchPos.col] == Road){//是路 可以走
117                 //2.1 能走   
118                 currentPos = searchPos;//走  
119                 pathMap[currentPos.row][currentPos.col].isFind = true;//标记走过 
120                 stack.push(currentPos);//入栈
121             }
122             break;
123         case p_left:
124             searchPos.col--;//1 找到试探点
125             //2 判断是否能走
126             //试探方向改变
127             pathMap[currentPos.row][currentPos.col].dir = p_right;
128             if (pathMap[searchPos.row][searchPos.col].isFind == false &&//没有走过
129                 map[searchPos.row][searchPos.col] == Road){//是路 可以走
130                 //2.1 能走   
131                 currentPos = searchPos;//走  
132                 pathMap[currentPos.row][currentPos.col].isFind = true;//标记走过 
133                 stack.push(currentPos);//入栈
134             }
135             break;
136         case p_right:
137             searchPos.col++;//1 找到试探点
138             //2 判断是否能走
139             if (pathMap[searchPos.row][searchPos.col].isFind == false &&//没有走过
140                 map[searchPos.row][searchPos.col] == Road){//是路 可以走
141                 //2.1 能走   
142                 currentPos = searchPos;//走  
143                 pathMap[currentPos.row][currentPos.col].isFind = true;//标记走过 
144                 stack.push(currentPos);//入栈
145             }
146             else{//2.2.2 第四个方向还不能走  
147                 //回退
148                 stack.pop();
149                 currentPos = stack.getTop();
150             }
151             break;
152         }//end of switch (pathMap[currentPos.row][currentPos.col].dir)
153         printMap(map, currentPos);
154         drawMap(map, currentPos);
155         Sleep(300);
156         //3 判断是否结束循环
157         //3.1 找到终点了
158         if (endPos == currentPos){
159             isFindEnd = true;
160             break;
161         }
162         //3.2 栈空了
163         if (stack.isEmpty()) break;
164     }
165 
166     if (isFindEnd){
167         cout << "喜大普奔,找到终点啦!" << endl;
168 
169         while (!stack.isEmpty()){
170             cout << "(" << stack.getTop().row << "," 
171                 << stack.getTop().col << ") ";
172             putimage(stack.getTop().col*SPACE + SPACE/4, 
173                 stack.getTop().row*SPACE + SPACE / 4, &pos);
174             stack.pop();
175         }
176         cout << endl;
177 
178     }
179 
180     
181     while (1);
182     return 0;
183 }
184 
185 
186 void drawMap(int map[ROWS][COLS], MyPoint pos){
187     for (int i = 0; i < ROWS; i++){
188         for (int j = 0; j < COLS; j++){
189             if (i == pos.row && j == pos.col){
190                 putimage(j*SPACE, i*SPACE, &ren);
191             }
192             else if (Wall == map[i][j]){
193                 putimage(j*SPACE, i*SPACE, &wall);
194             }
195             else if (Road == map[i][j]){
196                 putimage(j*SPACE, i*SPACE, &road);
197             }
198         }
199     }
200 }
201 void printMap(int map[ROWS][COLS], MyPoint pos){
202     system("cls");
203     for (int i = 0; i < ROWS; i++){
204         for (int j = 0; j < COLS; j++){
205             if (i == pos.row && j == pos.col){
206                 cout << "人";
207             }
208             else if (Wall == map[i][j]){
209                 cout << "墙";
210             }
211             else if (Road == map[i][j]){
212                 cout << "  ";
213             }
214         }
215         cout << endl;
216     }
217 }

 

  广度

    走过的路入树,把能走的路是下一次寻路的基础

 

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 //Y   竖着
  5 #define ROWS  10
  6 //X   横着
  7 #define COLS  10
  8 //试探方向
  9 enum direct{ p_up, p_down, p_left, p_right };
 10 class MyPoint{
 11 public:
 12     int row, col;
 13     friend bool operator==(const MyPoint& p1, const MyPoint& p2);
 14 };
 15 bool operator==(const MyPoint& p1, const MyPoint& p2){
 16     if ((p1.row == p2.row) && (p1.col == p2.col)) return true;
 17     return false;
 18 }
 19 
 20 struct treeNode{
 21     MyPoint                pos;        //点
 22     treeNode*            pParent;    //指向父节点的指针
 23     vector<treeNode*>    child;        //动态数组  数组里存指向孩子节点指针
 24     treeNode(){}
 25     ~treeNode(){
 26         pos.row = 0;
 27         pos.col = 0;
 28         pParent = NULL;
 29         child.clear();
 30     }
 31 
 32 };
 33 treeNode* createTreeNode(int row, int col);
 34 //判断pos点能不能走,能返回ture,不能返回false
 35 bool canWalk(int map[ROWS][COLS], bool pathMap[ROWS][COLS], MyPoint pos);
 36 
 37 
 38 int main(){
 39     //地图
 40     int map[ROWS][COLS] = {
 41         { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
 42         { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 },
 43         { 0, 1, 1, 0, 1, 0, 1, 1, 1, 0 },
 44         { 0, 0, 0, 0, 1, 0, 1, 1, 1, 0 },
 45         { 0, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
 46         { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
 47         { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
 48         { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
 49         { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
 50         { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }
 51     };
 52     //辅助地图
 53     bool pathMap[ROWS][COLS] = { 0 };
 54 
 55     MyPoint begPos = { 0, 0 };//起点
 56     MyPoint endPos = { 0, 9 };//终点
 57 
 58     pathMap[begPos.row][begPos.col] = true;
 59     treeNode* pRoot = NULL;//准备一棵树
 60 
 61     //起点成为树的根节点
 62     pRoot = createTreeNode(begPos.row, begPos.col);
 63 
 64 
 65     vector<treeNode*> buff;        //存储当前层
 66     buff.push_back(pRoot);//当前层里是树的根节点
 67     vector<treeNode*> nextBuff;    //存储下一层
 68     bool isFindEnd = false;
 69     treeNode* temp = NULL;
 70     while (1){
 71         nextBuff.clear();//清空下一层
 72         for (int i = 0; i < buff.size(); i++){//遍历当前层
 73             //找出 buff[i] 所有相邻能走节点  存放到nextBuff中 并且 入树
 74             for (int j = 0; j < 4; j++){
 75                 temp = createTreeNode(buff[i]->pos.row, buff[i]->pos.col);
 76                 switch (j){
 77                 case p_up:        temp->pos.row--;break;
 78                 case p_down:    temp->pos.row++; break;
 79                 case p_left:    temp->pos.col--; break;
 80                 case p_right:    temp->pos.col++; break;
 81                 }
 82                 if (canWalk(map, pathMap, temp->pos)){
 83                     //标记走过
 84                     pathMap[temp->pos.row][temp->pos.col] = true;
 85                     //入树
 86                     buff[i]->child.push_back(temp);    //temp成为buff[i]的子
 87                     temp->pParent = buff[i];        //buff[i]成为temp的父
 88 #if 1
 89                     if (endPos == temp->pos){
 90                         isFindEnd = true;
 91                         break;
 92                     }
 93 #endif
 94                     //存入nextBuff中
 95                     nextBuff.push_back(temp);
 96                 }
 97                 else{//不能走
 98                     delete temp;//释放
 99                     temp = NULL;
100                 }
101             }// end of for(j)
102             if (isFindEnd) break;
103         }// end of for(i)
104         if (isFindEnd) break;
105         if (0 == nextBuff.size()) break;//地图都遍历完了
106         buff = nextBuff;//切换到下一层去
107     }//end of while(1)
108 
109 
110     if (isFindEnd){
111         cout << "找到终点啦!" << endl;
112         while (temp){
113             cout << "("<<temp->pos.row << ","<< temp->pos.col << ") ";
114             temp = temp->pParent;
115         }
116         cout << endl;
117     }
118 
119     //层序遍历
120 
121 
122     while (1);
123     return 0;
124 }
125 
126 
127 treeNode* createTreeNode(int row, int col){
128     treeNode* pNew = new treeNode;
129     memset(pNew, 0, sizeof treeNode);
130     pNew->pos.row = row;
131     pNew->pos.col = col;
132     return pNew;
133 }
134 //判断pos点能不能走,能返回ture,不能返回false
135 bool canWalk(int map[ROWS][COLS], bool pathMap[ROWS][COLS], MyPoint pos){
136     //越界
137     if (pos.row < 0 || pos.row >= ROWS || pos.col < 0 || pos.col >= COLS) return false;
138     //是障碍物
139     if (1 == map[pos.row][pos.col]) return false;
140     //走过
141     if (true == pathMap[pos.row][pos.col]) return false;
142     return true;
143 }

 

标签:Wall,currentPos,常见,pos,算法,col,Road,row
From: https://www.cnblogs.com/yewu1/p/17396960.html

相关文章

  • 异常检测专栏(三)传统的异常检测算法——上
    前言在上一篇推文中,我们简要介绍了异常检测常用的几种数据集如ImageNet、CIFAR10/CIFAR100、MNIST等。接下来,我们将基于传统的异常检测算法分为上、下两部分,逐一介绍不同类别的方法。本教程禁止转载。同时,本教程来自知识星球【CV技术指南】更多技术教程,可加入星球学习。欢迎关注......
  • 分布式系统常见问题
    一.概述分布式系统存在网络,时钟,以及许多不可预测的故障。分布式事务,一致性与共识问题,迄今为止仍没有得到很好的解决方案。要想完美地解决分布式系统中的问题不太可能,但是实践中应对特定问题仍有许多可靠的解决方案。本文不会谈及诸如BASE,CAP,ACID等空泛的理论,只基于实践中遇......
  • 西门子S7-1200PLC双轴定位算法电池焊接控制博图程序 案例,触摸屏画面采用威纶触摸屏。
    西门子S7-1200PLC双轴定位算法电池焊接控制博图程序案例,触摸屏画面采用威纶触摸屏。程序设计结构灵活,采用SCL语言+梯形图结构,项目包括:1.博图V15PLC程序2.威纶通触摸屏程序3.电气施工图纸(PDF版本)4.电气采购BOM清单5.DI/DO定义表ID:31156755198......
  • 文心一言 VS chatgpt (16)-- 算法导论4.1 1~2题
    一、当A的所有元素均为负数时,FIND-MAXIMUM-SUBARRAY返回什么?文心一言:当A的所有元素均为负数时,FIND-MAXIMUM-SUBARRAY返回-1。这是因为在二进制中,当所有元素均为负数时,A的每个元素都对应一个负数,而-1的二进制表示是11111111,与A的每个元素的值的每一位的负号是相对应的,所以,如果F......
  • 算法训练DAY01
    算法训练DAY01|704.二分查找、27.移除元素704.二分查找大体思路:处理数组为空的特殊情况初始化left,right,使用[l,r]形式的二分法确定while条件,处理二分实现细节:(l+r)//2python中//运算符向下取整处理while中的分支时,最好用continue跳出循环,少用ifelse27.移除元素......
  • 精选论文 | Capon算法与MUSIC算法性能的比较与分析
    公众号【调皮连续波】,其他平台为自动同步,内容若不全或乱码,请前往公众号阅读。持续关注调皮哥,获得更多雷达干货学习资料和建议,和大家一起学习雷达技术。【正文】首先说结论:当信噪比(SNR)足够大时,Capon算法和MUSIC算法的空间谱非常相似,因此在SNR比较大时它们的性能几乎一样,当不同信号源......
  • m基于图像灰度共生矩阵纹理提取和GRNN神经网络的人口密度检测算法matlab仿真
    1.算法仿真效果matlab2013b仿真结果如下:  2.算法涉及理论知识概要       灰度共生矩阵,指的是一种通过研究灰度的空间相关特性来描述纹理的常用方法。[1] 1973年Haralick等人提出了用灰度共生矩阵来描述纹理特征。由于纹理是由灰度分布在空间位置上反复出现而形......
  • 代码随想录算法训练营第三天|203.移除链表元素 、707.设计链表 、206.反转链表
    一.链表基础1.最后一个节点的指针域指向null(空指针的意思)。2.链表在内存中不是连续分布的。3.链表的长度可以是不固定的,并且可以动态增删,适合数据量不固定,频繁增删,较少查询的场景。1#链表节点的定义2classListNode:3def__init__(self,val,next=None):4......
  • m基于HOG特征提取和GA优化GRNN网络的交通标志检测和识别算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要2.1遗传算法       遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于......
  • 记一次解‘字符串加解密’算法
    题目:对输入的字符串进行加解密,并输出。加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化。解密方法为加密的逆过程。数据范围:输入的......