首页 > 其他分享 >3.搜索

3.搜索

时间:2024-12-10 12:20:53浏览次数:4  
标签:ny int nx vis 搜索 mp

1.DFS 和 BFS 基础

1.DFS

ans;

void  dfs(层数, 其他参数)
{
    if(出局判断)
    {
        更新答案;
        return;
    }

    (剪枝)

    for (枚举下一层可能的情况)
    {
        if (!vis[i])
        {
            vis[i] = true;
            dfs(层数+1, 其他参数);
            vis[i] = false;
        }    
    }
}

2.BFS

queue<int> q;

vis[1] = true;
q.push(1);

while (q.size())
{
    int t = q.front();
    q.pop();

    for (int i = h[t]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!vis[j])
        {
            vis[j] = true;
            q.push(j);
        }
    }
}

求解连通性问题

洛谷P8662

char mp[N][N];
int vis[N][N];
int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int flag;
// dfs

void dfs(int x, int y)
{
    vis[x][y] = 1;
    if (mp[x][y + 1] == '#' && mp[x][y - 1] == '#' && mp[x - 1][y] == '#' && mp[x + 1][y] == '#')
        flag = 1;
    for (int i = 0; i < 4; i++)
    {
        int nx = x + d[i][0], ny = y + d[i][1];
        if (vis[nx][ny] == 0 && mp[nx][ny] == '#')
            dfs(nx, ny);
    }
}

// bfs
void bfs(int x, int y)
{
    queue<PII> q;
    q.push({x, y});
    vis[x][y] = 1;
    while (q.size())
    {
        PII t = q.front();
        q.pop();
        int tx = t.first, ty = t.second;
        if (mp[tx][ty + 1] == '#' && mp[tx][ty - 1] == '#' && mp[tx + 1][ty] == '#' && mp[tx - 1][ty] == '#')
            flag = 1;
        for (int i = 0; i < 4; i++)
        {
            int nx = tx + d[i][0], ny = ty + d[i][1];
            if (vis[nx][ny] == 0 && mp[nx][ny] == '#')
            {
                vis[nx][ny] = 1;
                q.push({nx, ny});
            }
        }
    }
}

void solve()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> mp[i];
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (mp[i][j] == '#' && vis[i][j] == 0)
            {
                flag = 0;
                bfs(i, j); // dfs(i, j);
                if (flag == 0)
                    ans++;
            }
        }
    }
    cout << ans << endl;
}

八皇后

P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

const int maxn = 1000;

int n, ans;
vector<int> s;
bool col[maxn], dg[maxn], udg[maxn]; // 列, 主对角线, 副对角线

void dfs(int u)
{
    if (u == n)
    {
        ans++;
        if (ans <= 3 && s.size() == n)
        {
            for (int i = 0; i < n; i++)		cout << s[i] << ' ';
            cout << endl;
        }
        return;
    }

    for (int i = 1; i <= n; i++)
        if (!col[i] && !dg[u + i - 1] && !udg[u - i + n]) // y=u,  x=i
        {
            s.push_back(i);
            col[i] = dg[u + i - 1] = udg[u - i + n] = true;
            dfs(u + 1);
            col[i] = dg[u + i - 1] = udg[u - i + n] = false;
            s.pop_back();
        }
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    dfs(0);
    cout << ans;
}

2.剪枝

  • 可行性剪枝:对当前状态进行检查,如果当前条件不合法就不再继续,直接返回

  • 搜索顺序剪枝:搜索树有多个层次和分支,不同的搜索顺序会产生不同的搜索树形态,复杂度也相差很大

  • 最优性剪枝:在最优化问题的搜索过程中,如果当前花费的代价已超过前面搜索到的最优解,那么本次搜索就没有继续进行下去的意义,直接退出

  • 排除等效冗余:如果沿当前节点搜索它的不同分支,最后的结果是一样的,那么只搜索一个分支就够了

  • 记忆化搜索:在递归的过程中,有许多分支被反复计算,会大大降低算法的执行效率。用记忆化搜索,将已经计算出来的结果保存起来,以后需要用到时直接取出结果,避免重复运算,从而提高了算法的效率。记忆化搜索主要应用于动态规划

标签:ny,int,nx,vis,搜索,mp
From: https://www.cnblogs.com/Aurora-333/p/18597145

相关文章

  • uniapp 如何实现扫码搜索
    场景描述在众多移动应用中需要用到扫码二维码或条码查询信息的场景比比皆是,如商品管理中查询商品信息,订单跟踪过程中扫码单号查询订单信息和库存管理中的商品盘点。                                (图......
  • ElasticSearch搜索引擎常见面试题总结
    一、ElasticSearch基础:1、什么是Elasticsearch:Elasticsearch是基于Lucene的Restful的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。全文检索是指对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当查询时,根据......
  • 做好的页面,你是如何获取更好的搜索引擎优化?
    要做好前端页面的搜索引擎优化(SEO),需要关注以下几个方面:1.技术性SEO:确保搜索引擎可以轻松访问和理解你的网站。页面速度优化:这是至关重要的。使用工具如GooglePageSpeedInsights,Lighthouse来分析和改进。压缩图片,优化代码,使用CDN,启用浏览器缓存等都是有效的策略。......
  • 搜索技巧
    实验步骤一,打开必应搜索引擎在浏览器网址栏当中输入:https://www.bing.com回车进入页面intitle在必应的语法中可以指定在标题中包含的内容,增加指定内容在搜索返回结果的权重。intitle:admin inurl在必应的语法中可以指定搜索返回的结果的网页的链接当中包含的内容。......
  • VS2019的c代码不包含stdio.h就无法编译通过?头文件路径搜索顺序五花八门,有没有规律?搜
    VS2019的c代码不包含stdio.h就无法编译通过?有时,为了做一些测试,不希望包含系统头文件stdio.h,只希望用extern引用printf声明。但在VS2019可能会遇到链接错误:"errorLNK2019:无法解析的外部符号_printf,函数_main中引用了该符号".增加链接ucrt:#pragmacomment(lib,......
  • 算法刷题打卡DFS深度搜索
    DFS概要:    要想学会深度优先搜索的题目,首先需要知道他的代码原理,适用场景基本原理:    DFS是基于遍历,搜索树,图的算法,通过从根节点(或任意起始节点)开始,沿着每个分支深入访问节点,直到到达叶子节点或没有未访问的邻居节点为止,然后回溯到上一个节点,继续搜索其他......
  • 高德地图搜索“南京大学”原理及简单伪代码【一看就会】【OneGIS开发】
    1. 用户端发起请求-用户在安卓设备上打开高德地图应用,这一操作会激活应用与服务器之间的通信链路。当用户在搜索框输入“南京大学”并点击搜索按钮时,安卓应用会收集一些必要的信息。这些信息包括用户输入的关键词“南京大学”,还有设备的位置信息(通过GPS或网络定位获取),以及设......
  • 洛谷 P1359 租用游艇 C语言 记忆化搜索
    题目:https://www.luogu.com.cn/problem/P1359题目描述长江游艇俱乐部在长江上设置了 n 个游艇出租站 1,2,⋯ ,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 i 到游艇出租站 j 之间的租金为r(i,j)(1≤i<j≤n)。试设计一个算......
  • 230. 二叉搜索树中第 K 小的元素
    问题描述给定一个二叉搜索树的根节点root,和一个整数k,请你设计一个算法查找其中第k小的元素(从1开始计数)。分析已经给定BST,找出第k大的数字。可以利用BST性质:中序遍历一定是升序数组,遍历到第k个结点即为答案,复杂度O(n)注意,java中成员变量名与函数形参重名,可以用this.x......
  • 利用MeiliSearch和OpenAI API打造智能搜索系统
    利用MeiliSearch和OpenAIAPI打造智能搜索系统简介在本文中,我们将展示如何结合使用MeiliSearch和OpenAI的API来创建一个智能搜索系统。MeiliSearch是一款开源、高性能的搜索引擎,而OpenAI提供了强大的自然语言处理(NLP)模型。通过这两个工具,我们可以实现高效而智能的文本搜索......