首页 > 编程语言 >自学算法

自学算法

时间:2023-01-09 23:35:19浏览次数:28  
标签:10 终点 end int step start 算法 自学

第二周_自学算法

1. DFS 和 BFS

迷宫问题:

题意:

​ 找到从起点到终点的最短路径长度。

思路1:

深度优先搜索 (DFS)

从起始位置出发, 按照顺时针方向沿着一个方向向下试探, 找到终点, 若还有其他可到达终点的路径就回溯, 以此类推找到所有可到达终点的路径, 过程中记录能到达终点的较短路径, 最后输出最短路径。

注: 每个位置都有上, 下, 左, 右四个方向可以走, 我们规定按顺时针方向右, 下, 左, 上进行探索

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 50;  // 迷宫行和列的最大值

int n, m;  // n 行, m列
int start_x, start_y, end_x, end_y;  // 起始位置和终点坐标
int arr[N + 10][N + 10];  // 要输入的迷宫图, 用 1 表示是空地, 用 2 表示障碍物
int v[N + 10][N + 10];  // 标记, 1 表示已标记不能走, 0 表示是空地可以走
int min1 = INT_MAX;  // 最短路径
int d_x[4] = {0, 1, 0, -1}, 
	d_y[4] = {1, 0, -1, 0};  // 按右, 下, 左, 上探索

void dfs(int x, int y, int step)  // 每走一个单元格 step 加 1
{
    // 找到终点的情况
    if (x == end_x && y == end_y)
    {
        if (step < min1) min1 = step;
        return;	// 回溯
    }
    
    // 探索
    for (int k = 0; k < 4; k++)
    {
        int sx = x + d_x[k];
        int sy = y + d_y[k];
        // 判断能不能走
        if (arr[sx][sy] == 1 && v[sx][sy] == 0)
        {
            v[sx][sy] = 1;  // 能走就标记
            dfs(sx, sy, step + 1);  // 往前探索
            v[sx][sy] = 0;  // 回溯时收回标记
        }
    }
    
    return;
}

int main(void)
{
    cin >> n >> m;
    
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &arr[i][j]);
    
    cin >> start_x >> start_y;
    cin >> end_x >> end_y;
    
    dfs(start_x, start_y, 0);
    
    cout << min1;
    
    return 0;
}

思路2:

广度优先搜索 (BFS)

  1. 将起点入队

  2. 若队首结点能扩展, 则将能扩展的点入队; 若队首不能再扩展, 则将队首结点出队

  3. 重复第二步, 直到到达终点或队为空时结束

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 50;

int n, m;  // n 行, m列
int start_x, start_y, end_x, end_y;  // 起始位置和终点坐标
int arr[N + 10][N + 10];  // 要输入的迷宫图, 用 1 表示是空地, 用 2 表示障碍物
int v[N + 10][N + 10];  // 标记, 1 表示已标记不能走, 0 表示是空地可以走
int d_x[4] = {0, 1, 0, -1}, 
	d_y[4] = {1, 0, -1, 0};	// 按右, 下, 左, 上探索

// 结点结构体
struct point
{
    int x;
    int y;
    int step;
};

queue<point> p;	// 申请队列

void bfs(int start_x, int start_y)
{
    // 起点入队
    point start;
    start.x = start_x;
    start.y = start_y;
    start.step = 0;
   	p.push(start);
    v[start_x][start_y] = 1;
    
    while (!p.empty())
    {
        int x = p.front().x;
        int y = p.front().y;
        
        // 到达终点情况
        if (x == end_x && y == end_y)
        {
            cout << p.front().step;
            break;
        }
        
        // 探索
        for (int k = 0; k < 4; k++)
        {
            int sx = x + d_x[k];
            int sy = y + d_y[k];
            if (arr[sx][sy] == 1 && v[sx][sy] == 0)
            {
                point temp;
                temp.x = sx;
                temp.y = sy;
                temp.step = p.front().step + 1;
                p.push(temp);
                v[sx][sy] = 1;
            }
        }
        p.pop();  // 不能或扩展完后就出队
    }
}

int main(void)
{
    cin >> n >> m;
    
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &arr[i][j]);
    
    cin >> start_x >> start_y;
    cin >> end_x >> end_y;
    
    bfs(start_x, start_y);
    
    return 0;
}

输入:

5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 1
1 1
4 3

输出:

7

标签:10,终点,end,int,step,start,算法,自学
From: https://www.cnblogs.com/Ailicode/p/17038844.html

相关文章

  • 代码随想录算法训练营第八天LeetCode28, 459
    代码随想录算法训练营第八天|LeetCode28,459Leetcode28找出字符串中第一个匹配项的下标题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence......
  • Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
    全文链接:http://tecdat.cn/?p=31201原文出处:拓端数据部落公众号摘要:此报告首先将dataset进行数据清洗,得到dataset_new。再将dataset_new中属性分为基本信息、贷款行为/......
  • 1.不同算法对运行时间的影响
    packagesuanfa1;​​import java.util.*;​​publicclassMain{​  publicstaticintfib1(intn){    if(n<=1)returnn;    returnf......
  • 算法设计与分析
    第一章算法概述这门课在计算机专业是核心课程,但是在我所学的智能科学与技术专业作为选修课程出现,尽管作为选修课,但是算法作为公司面试必考,有必要深入好好学习,我们在Tinto......
  • 莫队算法学习(转载)
    1.https://blog.csdn.net/Just__Do__IT__/article/details/118991059?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167326430316782428668181%2522%252C%252......
  • 素数有关基本算法
    该文章包含模块为判断素数,分解质因数,筛素数三大模块判断素数我们最容易想到的素数判断就是试除法,就是枚举从2到n-1中所有的数,尝试从其中找到n的因数,找到了就是合数,反之......
  • 代码随想录算法训练营第13天
    今日刷题2道:239.滑动窗口最大值,347.前K个高频元素。● 239.滑动窗口最大值题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%......
  • 【算法原理】矩阵乘法
    【算法原理】矩阵乘法一般是矩阵乘法+快速幂,结合\(dp\)普通矩阵乘法:矩阵乘法有结合律,无交换律。因此在计算一长串矩阵相乘的时候,可以依据计算难度选择计算顺序,从而......
  • Miller-Rabin算法学习笔记
    个人不是很理解Miller-Rabin算法的正确性,所以这篇东西可以图一乐(确定性判素性的方法都很慢,所以要考虑随机但是错误概率低的判素方法。首先有Fermat素性测试,即费马小定理......
  • 线性表算法相关练习
    //将两个递增的有序链表合并为一个递增的有序链表。//要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。#include<iostream>#......