• #C++初学记录(深度搜索#递归)


    深度搜索
    走地图的题目是深度搜索里比较容易理解的题目,更深层次的是全排列和七皇后等经典题目,更加难以理解,代码比较抽象。
    题目:红与黑
    蒜厂有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。

    请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

    输入格式
    第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。WW 和 HH 都不超过 2020。

    在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

    1)'.':黑色的瓷砖;
    2)'#':白色的瓷砖;
    3)'@':黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

    输出格式
    输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

    输出时每行末尾的多余空格,不影响答案正确性

    样例输入
    6 9
    ....#.
    .....#
    ......
    ......
    ......
    ......
    ......

    @...#

    .#..#.
    样例输出
    45
    AC代码

    <font size=4 face="微软雅黑">#include <cstdio>
    #include <iostream>
    using namespace std;
    int n,m;
    int step=0;//代表到达黑色瓷砖的块数
    char maze[30][30];
    bool vis[30][30];
    int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//代表上下左右四个方向
    //判断数组是否越界
    bool in(int x,int y)
    {
        return 0<=x&&x<n&&0<=y&&y<m;
    }
    void dfs(int x,int y)
    {
        step++;
        vis[x][y]=true;
        for(int i=0;i<4;i++)
        {
            int tx=x+dir[i][0];//x的变化
            int ty=y+dir[i][1];
            if(!vis[tx][ty]&&maze[tx][ty]=='.'&&in(tx,ty))
            {
                dfs(tx,ty);
            }
        }
    }
    int main()
    {
        
        cin>>m>>n;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>maze[i][j];
            }
        }
        int x,y;
        //寻找@的位置
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(maze[i][j]=='@')
                {
                    x=i;
                    y=j;
                }
            }
        }
        dfs(x,y);
        cout<<step; 
        return 0;
    }
    

    代码理解
    编写代码主要遇到的问题是如何让程序自己进行“行走”,因此我编辑代码

    int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    

    int tx=x+dir[i][0];
    int ty=y+dir[i][1];
    

    成为配套程序让程序自己进行“行走”。在“行走”的函数中这连个代码会帮助程序进行计数和行走,计数则需要加一个

    step++;
    

    行走在地图上首要考虑的是越界相关的问题,这时候就需要一个判定函数,该函数应该对重复路线,碰壁,范围进行判定,既是

    bool in(int x,int y)
    {
        return 0<=x&&x<n&&0<=y&&y<m;
    }
    

    若return不成立则返回false,若成立则返回ture,与该函数进行匹配的程序是

    vis[x][y]=true;
    if(!vis[tx][ty]&&maze[tx][ty]=='.'&&in(tx,ty));
    

    递归函数可以让程序自己不停的“行走”,直到完成整个运行输出step

  • 相关阅读:
    【Java/加解密】将字符串后N位用0覆盖
    【Oracle】使用sqlldr命令行从csv文件获得数据导入Oracle数据库某表中
    【Java/shell】Java使用Runtime和Process调用dos命令
    【Java/shell/Oracle】Java使用Runtime和Process调用sqlldr命令向Oracle数据库某表批量塞入数据
    【依赖】使用Apache的Codec如base64需要引用的依赖
    【Java/FTP】使用apache.commons的FTPClient往FTP服务器上传下载文件
    Dapr云原生应用开发系列7:工作流集成
    rtop – 通过SSH监控远程主机
    2022年区块链影响最大的四个行业
    CentOS Linux 8生命周期结束
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/10672774.html
Copyright © 2020-2023  润新知