opencv制作微信小游戏 最强连一连 辅助(2)--dfs深度优先搜索算法

深度优先搜索算法还是大二上数据结构的时候学的,工作以后都忘得差不多了.赶紧回来温习一下吧.

深度优先搜索的算法的 入参是一个地图(一般可以用二维数组表示)和一个起始点.

比如

在这里插入图片描述

这个就是一个5*5的二维的数组,可以表示一个地图

他的起点是2 ,可以走的路是1,不可以走的路是0

这个是我在游戏代码控制台里面截取的, 来看一下,这个数组对应的 游戏画面


至于地图是怎么识别成二维数组的我们下一个章节讲

今天我们就来看看 上面的二维数组地图 怎么样才能让计算机找到出路,也就是dfs算法

先看一下 dfs 算法的大体的思路

void dfs(条件)
{
    if(满足输出条件)
    {
        输出解;
        return ;
    }
 
        for(int i=0;i<尝试方法数;i++)
        {
            if(满足进一步搜索条件)
            {
                //下一步走的路打上标记
                //走过的路存储
                dfs(条件);
                  //走过的路删除
               //  恢复到打标记前的状态(反悔操作)
            }
	  }
}

整体而言是递归

下面对上面的伪代码 做进一步的说明

1.首先对于上面的伪代码中的 尝试方法数
这个数字是4
为什么是4了? 因为地图只能往上下左右4个方向走

2.然后就是 下一步走的路打上标记+恢复到打标记前的状态(反悔操作)
针对二维数组地图而言,能走的路是1 不能走的是0 .如果下一步尝试走的位置是1 ,并且下一步尝试走的路没有超出地图的范围,也就是
满足进一步搜索条件 ,我们只要把下一步可以走的路置位0,并且走到下一步就可以了.也就是对应 下一步走的路打上标记

同样的,在回退的时候要把 改动的0,变成1 ,表示可以走 ,也就是 恢复到打标记前的状态(反悔操作)

3.然后就是条件满足输出条件了
一般的dfs都是给定 起点和终点,所以只要判断下一步位置 是否是终点 就ok了,但是在游戏中并没有给定终点的位置, 所以我们要换个思路.

那就是走的方块的数量,当我们把所有的方块走完了 也就表示结束了.所以条件就是方块数,
每走一步,方块数减一,递归调用传参

4.最后就是走过的路存储 走过的路删除
这个好理解,走过的路存储起来 ,当全部方块走完后,依次输出走过的路就是答案了.

OK了

上个完整的代码看一看

#include <iostream>
using namespace std;

int dx[4]={0,-1,0,1} ;
int dy[4]={-1,0,1,0};

int qeue[50][2];
int qeuePosition=0;
int gameMap[5][5]={
    1,1,1,0,0,
    0,1,1,1,1,
    1,1,1,1,1,
    1,1,1,1,1,
    0,1,1,2,0
};

    
    
    
void print()
{
    for(int i=0;i<=qeuePosition-1;i++) 
    {
        cout<<"("<<qeue[i][0]<<","<<qeue[i][1]<<")";
        if(i!=qeuePosition-1)cout<<"->";
    }
    return;
}


void dfs(int x,int y,int blockSize)
{
    if (blockSize == 0   ) {
        cout << "找到答案了";
        print();
        cout<<endl;
        return  ;
    }

    for (int i = 0; i < 4; i++) {
        int nextX = x + dx[i];
        int nextY = y + dy[i];
        if (nextX >= 0 && nextX <=4 && nextY >= 0 && nextY <= 4 && gameMap[nextX][nextY] == 1  ) {
            //下一步可走
            gameMap[nextX][nextY] = 0;
            qeue[qeuePosition][0] = nextX;
            qeue[qeuePosition][1] = nextY;
            qeuePosition++;
            dfs(nextX, nextY, blockSize - 1);

            gameMap[nextX][nextY] = 1;
            qeuePosition--;
        }
    }
}


int main()
{
    dfs(4,3,19);
}

运行后可以看到如下的结果

在这里插入图片描述
拿到地图中对比一下 发现是ok的.

在这个程序中,二维数组地图是我在初始化的时候手动指定的,计算机是不能直接认识游戏地图的,因为它没有人脑的那种能力,它只能跑死程序,所以我们只有2种方式让计算机知道地图,一种是像上面的代码在初始化的时候指定,还有一种是在运行的时候手动输入给二维数组赋值.

如果是这样的话那可玩性太低了,好在有计算机视觉技术,这个也是我下面将要写的,如何将人一眼就能看懂的地图自动的转换成计算机能够识别的二维数组.这还是一个比较有意思的事情.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值