zoukankan      html  css  js  c++  java
  • Day1 BFS算法的学习和训练

    ​ 因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划。

    ​ 我是根据《算法图解》的顺序进行安排的,自己对散列表和递归调用栈还算有点初步的了解,所以从图算法开始了,希望markdown能一直写下去,自己学习算法能一直坚持下去。

    ​ BFS给我的感觉是用于图的搜索算法。

    ​ 看书的时候自己有这么几个疑问:

    Q1:它是一个搜索算法,那么它计数是在哪记的?

    Q2:C++的队列怎么快速创建?有哪些api?(因为只在数据结构对队列有所了解,感觉应该不可能手写结构体和函数吧0.0)

    (hhhh萌新问题嘛)

    这里有篇随笔感觉对我这种入门辣鸡的萌新很友好https://blog.csdn.net/jiange702/article/details/81365005

    #include<iostream>
    using namespace std;
    #include<string>
    #include<stdio.h>
    #include<queue> //这里就解决了我的Q2问题,是直接用头文件引入就好啦
    
    /*
     *BFS算法的模板就大概是
     1.创建队列
     2.push头节点
     3.循环
     {
     1.以队列不为空为条件
     2.pop出头节点
     3.根据题目条件进行判
     4.push进头节点的子节点
     }
     */
    void BFS()
    {
    	memset(visited, 0, sizeof(int));
    	queue<co> q;
    	co A;
    	A.x = 0;
    	A.y = 0;
    	visited[0][0] = 1;
    	zhen[0][0].x = 0;
    	zhen[0][0].y = 0;
    	
    	q.push(A);	
    	while(!q.empty())
    	{
    		co te = q.front();
    		q.pop();	//弹出队列 
    		
    		if(te.x==4 && te.y== 4)
    		{
    			return; 
    		}
    		for(int i = 0; i < 4; i++)
    		{
    			int tx = te.x + xx[i];
    			int ty = te.y + yy[i];
    			if(tx<0 || ty<0 || tx>4 || ty>4 || visited[tx][ty]==1)
    				continue;
    			visited[tx][ty] = 1;
    			co child;
    			child.x = tx;
    			child.y = ty;
    			q.push(kao);
    			zhen[tx][ty].x = te.x;
    			zhen[tx][ty].y = te.y;//这里是记录子节点的来源坐标,是由于这个“迷宫”题目要求的坐标,但这里也可以改成zhen[tx][ty] = zhen[te.x][te.y] + 1;这里就解决了我Q1问题,可以记录最短路径数
    		}
    	 } 
     } 
    

    今天的训练是LeetCode102 二叉树的层次遍历

    代码如下:

    class Solution {
    public:
        bool isSymmetric(TreeNode* root) {
        queue<TreeNode*> q,p;
        q.push(root);
        p.push(root);
        while(!q.empty() || !p.empty())
        {
            TreeNode* t1 = q.front();
            q.pop();
            TreeNode* t2 = p.front();
            p.pop();
            if(t1 == NULL && t2 == NULL)    continue;
            if(t1 == NULL || t2 == NULL)   return false;
            if(t1->val != t2->val)  return false;
            q.push(t1->left);
            q.push(t1->right);
            p.push(t2->right);
            p.push(t2->left);
        }
            return true;
        }
    };
    
  • 相关阅读:
    hdu1203I NEED A OFFER!(01背包)
    poj3984迷宫问题(dfs+stack)
    hdu1422重温世界杯(动态规划,最长子序列)
    hdu1231最大连续子序列(动态规划)
    cf#514B. Forgery(暴力)
    uvaoj455Periodic Strings(枚举)
    uvaoj1225Digit Counting(暴力)
    uvaoj1586Molar mass(暴力)
    uvaoj1585Score(暴力)
    使用哈希值和&和2^n数组生成索引值的原理
  • 原文地址:https://www.cnblogs.com/kiznaiver1998/p/10745475.html
Copyright © 2011-2022 走看看