首页 > 编程语言 >《算法竞赛》---搜索

《算法竞赛》---搜索

时间:2024-01-10 17:24:55浏览次数:34  
标签:nx 竞赛 int dfs --- vis 算法 include 1010

搜索

二叉树搜索

bfs搜索二叉树---p98

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n;
char a[100000];
struct node
{
    char value;
    int lson,rson;
}tree[N];
int idx=1;
int newnode(char val)
{
    tree[idx].value=val,tree[idx].lson=0,tree[idx].rson=0;//
    return idx++;
}
void insert(int father,int tmp,int l)
{
    if(l==0)tree[father].lson=tmp;
    else tree[father].rson=tmp;
}
int buildtree()
{
  cin>>n;
  char h;
  cin>>h; a[1]=newnode(h);
  for(int i=2;i<=n;i++)
  {
      char g;cin>>g;a[i]=newnode(g);
  }
  bool is=true;
   for(int i=2;i<=n;i++)
  {
     if(is)
       {insert(a[i-1],a[i],0);is=false;}
       else {insert(a[i-1],a[i],1);is=true;}
  }
   return a[1];
}
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    int root=buildtree();
    queue<int>q;
    q.push(root);
    while(q.size())
    {
        int tmp=q.front();
    cout<<tree[tmp].value<<' ';
    q.pop();
    if(tree[tmp].lson!=0)q.push(tree[tmp].lson);
    if(tree[tmp].rson!=0)q.push(tree[tmp].rson);
    }
    return 0;
}

连通性判断(bfs,dfs,并查集)

注意搜索的是会被全部淹没的连通块

全球变暖(bfs)-----p106--蓝桥杯

//输入案例
7
.......
.##....
.##....
....##.
..####.
...###.
.......


#include <bits/stdc++.h>
using namespace std;
int n,ans;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
char a[1010][1010];
bool vis[1010][1010];
bool g;
struct node{
  int x,y;
};
void bfs(int x,int y)
{
    g=false;
    queue<node>q;
    q.push({x,y});
    vis[x][y]=true;
    while(q.size())
    {
        int mx=q.front().x,my=q.front().y;
        int res=0;
        q.pop();
        for(int i=0;i<4;i++)
        {
          int nx=mx+dx[i],ny=my+dy[i];
          if(nx<1||nx>n||ny<1||ny>n||a[nx][ny]=='.')continue;
          if(vis[nx][ny]){res++;continue;}
           res++;
           q.push({nx,ny});
           vis[nx][ny]=true;
        }
        if(res==4){g=true;}
    }
}
int main()
{
  // 请在此输入您的代码
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>n;
     for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
     {
       cin>>a[i][j];
      
     }
      for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
     {
      if(a[i][j]=='#'&&!vis[i][j])
      {
        bfs(i,j);
        if(!g)ans++;
      }
     }
     cout<<ans;
  return 0;
}

注意 bool元素df递归时候被后面false覆盖问题

全球变暖(dfs版本)

#include<bits/stdc++.h>
using namespace  std;
int res,n;
char a[1010][1010];
bool df;
bool vis[1010][1010];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void  dfs(int x,int y)
{
   
    vis[x][y]=true;
    for(int i=0;i<4;i++)
    {
      if(a[x+dx[i]][y+dy[i]]=='.')break;
      if(i==3)df=true;//这样写才可以防止写出false
    }
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(!vis[nx][ny]&&a[nx][ny]=='#')
        dfs(nx,ny);
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie();
    cin>>n;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    cin>>a[i][j];
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(a[i][j]=='#'&&!vis[i][j])
        {
            df=false;
            dfs(i,j);
        if(!df)res++;
        }
    }
    cout<<res;
    return 0;
}

剪枝

bfs去重

八数码问题分支---跳蚱蜢(p110)---蓝桥杯642

#include<bits/stdc++.h>
using namespace std;
int bfs(string s)
{
   string end="087654321";
   unordered_map<string,int>dist;
   queue<string>q;
   q.push(s);
  dist[s]=0;
  while(q.size())
  {
    auto t=q.front();q.pop();
    int r=dist[t];
    if(t==end)return r;
    int x=t.find('0');
      for(int i=-2;i<=2;i++)//四种方向,
      {
           int nx=(x+i+9)%9;//代码核心,将圆盘位置化为直线位置
           if(nx<0||nx>8||nx==x)continue;//特判超出和本身
           swap(t[nx],t[x]);
           if(!dist[t])
           {
             dist[t]=r+1;
             q.push(t);
           }
           swap(t[nx],t[x]);
      }
  }
  return -1;
}
int main()
{
  ios::sync_with_stdio(false);cin.tie();cout.tie();
  string s="012345678";
  cout<<bfs(s);
  return 0;
}

dfs 可行性剪枝+最优性剪枝--洛谷5194

前缀和进行最优性剪枝

#include<bits/stdc++.h>
using namespace std;
int n,c;
long long a[1010],s[1010];
long long ans;
void dfs(int u,long long sum)
{
    if(sum>c)return;
    if(s[u]+sum<=c)//如果当前sum+s[u]可以全拿直接拿走,回溯看看之前能不能拿
    {
        ans=max(ans,sum+s[u]);
        return;
    }
    if(sum+a[u]<=c)dfs(u-1,sum+a[u]);//如果当前元素能拿拿走并且向下搜索
    dfs(u-1,sum);//拿不了,就向下搜素
}
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>n>>c;
    for(int i=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]+a[i];}
    dfs(n,0);//倒着查肯定搜素快一点利于使用前缀和剪枝
    cout<<ans;
    return 0;
}

dfs 可行性剪枝p112(poj 3278)

dfs 奇偶剪枝----p114(hdu 1010)

flood fill模型

1v312 ( Red and Black )

普通的连通块问题

#include<iostream>
#include<cstring>
using namespace std;
int n, m;
char a[21][21];
bool  vis[21][21];
int cnt;
int d[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
void dfs(int x, int y)
{
    vis[x][y] = true;
    cnt++;
    for (int i = 0; i < 4; i++)
    {
        int nx = x + d[i][0], ny = y + d[i][1];
        if (nx > 0 && nx <= n && ny > 0 && ny <= m && !vis[nx][ny] && a[nx][ny] == '.')
        {
            dfs(nx, ny);
        }
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(); cout.tie();
    while (1)
    {
        cin>>n>>m;
        if(n==0&&m==0)break;
        int x, y;
        swap(n,m);
        for (int i = 1; i <= n;i++)
            for (int j = 1; j <= m;j++)
            {
                cin >> a[i][j];
                if (a[i][j] == '@')
                    x = i, y = j;
            }
        dfs(x, y);
        cout << cnt << endl;
         memset(vis,false,sizeof vis);
        cnt = 0;
    }

    return 0;
}

The Wedding Juicer--p122(poj 2227)

优先队列处理边界

从周围堵中央

每次处理边界最矮的往内部扩散--(因为最矮的不会妨碍后面)

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int n, m;
const int N = 310;
typedef long long ll;
#define fr first
#define se second
ll a[N][N];
bool vis[N][N];
typedef pair<int, int>PII;
int d[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
ll cnt;
struct cmp {
    bool operator()(pair<pair<int,int>,ll> a,pair<pair<int, int>, ll> b) {
        return a.second > b.second;
    }

};
void bfs()
{
    priority_queue<pair<pair<int, int>, ll >, vector<pair<pair<int, int>, ll>>,cmp>q;
    cnt = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            if (i == 1 || j == 1 || i == n || j == m)
            {
                q.push({ {i,j },a[i][j] });
                vis[i][j] = true;
            }
        }
    while (q.size())
    {
        
        int h = q.top().se, x = q.top().fr.fr, y = q.top().fr.se; q.pop();
        for (int i = 0; i < 4; i++)
        {
            int nx = x + d[i][0], ny = y + d[i][1];
            ll hh = a[nx][ny];
            if (nx <= 0 || nx > n || ny <= 0 || ny > m || vis[nx][ny])continue;
            if (hh < h)
            {
                cnt += h - hh;
              //  cout << a[nx][ny] << ' ' << hh << '\n';
                hh = h;
            }
            q.push({ {nx,ny},hh });
            vis[nx][ny] = true;
        }
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(); cout.tie();
    cin >> n >> m;
    swap(n, m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    bfs();
    cout << cnt << endl;
    return 0;
}

填涂颜色---p123(洛谷1162)

将所有0先全部染成2

dfs从四周到中央搜索,与上题目寻找所有储水单位一样,从边缘i1||j1||jn||in搜索为2的点,染成0,最后输出矩阵

#include<bits/stdc++.h>
using namespace std;
const int N=31;
bool vis[N][N];
int a[N][N];
int n,m;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y)
{
    if(a[x][y]==2)
    a[x][y]=0;
    for(int i=0;i<4;i++)
    {
        int nx=x+d[i][0],ny=y+d[i][1];
        if(nx<1||nx>n||ny<1||ny>n||!a[nx][ny]||a[nx][ny]==1)continue;
        dfs(nx,ny);
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        cin>>a[i][j];
    if(!a[i][j])a[i][j]=2;
    }
     for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if((i==1||j==1||i==n||j==n)&&a[i][j]==2)
        dfs(i,j);
    }
     for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        cout<<a[i][j]<<' ';
        cout<<endl;
    }
    return 0;
}

标签:nx,竞赛,int,dfs,---,vis,算法,include,1010
From: https://www.cnblogs.com/yuexiabaobei/p/17956918

相关文章

  • rm -rf dir删除不了的几种情况
    我勒个去!root用户通过rm-rf竟无法删除文件了!原创 浩道 浩道Linux 2024-01-0907:50 发表于广东关注上方浩道Linux,回复资料,即可获取海量Linux、Python、网络通信、网络安全等学习资料!前言大家好,这里是浩道Linux,主要给大家分享Linux、Python、网络通信、网络安全等相......
  • AP8854 宽压降压电源管理芯片12-80V 7v2.5A 应用于电动车手暖套的PBC线路
    AP8854一款宽电压范围降压型DC-D电源管理芯片,内部集成使能开关控制、基准电源、误差放大器、过热保护、限流保护、短路保护等功能,非常适合宽电压输入降压使用。AP8854带使能控制,可以大大节省外围器件,更加适合电池场合使用,具有很高的方案性价比。产品特点:电压输入范围10V至......
  • 张正友棋盘代码-python
    具体实现方案:棋盘是一块由黑白方块间隔组成的标定板,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。之所以我们用棋盘作为标定物是因为平面棋盘模式更容易处理(相对于复杂的三维物体),但与此同时,二维物体相对于三维物体会缺少一部分信息,于是我们会多次改变棋盘的......
  • php入门学习-2
    运算符与优先级  php的运算符分为:算术运算符,字符串运算符,赋值运算符,位运算符,条件运算符,逻辑运算符等。  当各种运算符同在一个表达式中时,运算是有一定优先级的。  1.算术运算符  + 加法  - 减法  * 乘法  / 除法  % 求余......
  • Spark 框架模块和Spark的运行模式 -
    整个Spark框架模块包含:SparkCore、SparkSQL、SparkStreaming、SparkGraphX、SparkMLlib,而后四项的能力都是建立在核心引擎之上SparkCore:Spark的核心,Spark核心功能均由SparkCore模块提供,是Spark运行的基础。SparkCore以RDD为数据抽象,提供Python、Java、Scala、R语......
  • 【服务器数据恢复】虚拟机文件丢失导致Hyper-V服务瘫痪,虚拟机无法使用的数据恢复案例
    服务器数据恢复环境:WindowsServer操作系统服务器,部署Hyper-V虚拟化环境,虚拟机的硬盘文件和配置文件存放在某品牌MD3200存储中,MD3200存储中有一组由4块硬盘组成的raid5阵列,存放虚拟机的数据文件;另外还有一块硬盘存放虚拟机数据文件的备份。服务器故障&检测:由于MD3200存储中虚拟......
  • 迅为iTOP-3568开发板助力实时系统,Preemption与Xenomai
    iTOP-RK3568开发板使用手册上新,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。iTOP-RK3568开发板支持了Preemption和Xenomai实时系统。实时系统以其卓越的实时性能,为用户提供出色的体验,《iTOP-3568开发板实时系统使用手册》将对实时系统的选择、编译烧写、测试等方......
  • Oracle-概要文件dba_profiles(资源配置)
    DBA_PROFILES用来显示所有配置文件及其限制。在11g数据库环境中,dba_profiles的结构只有4个字段,分别是PROFILE\RESOURCE_NAME\RESOURCE_TYPE\LIMIT;在12c及以上的Oracle数据库中,新增了COMMON\INHERITED\IMPLICIT。1.通过select语句查看所有配置及限制。select*fromdba_profil......
  • InnoDB delete-update加锁流程分析
    死锁原因:并发事务在执行过程中,因争夺锁资源而造成互相等待。加锁顺序导致死锁:不同表加锁顺序相反、相同表不同行加锁顺序相反,其中相同表不同行加锁顺序相反造成死锁有很多变种,其中容易忽略的是给辅助索引行加锁的时候,同时会给聚集索引行加锁;同时还可能出现在外键索引时,给父表加......
  • 无涯教程-Redis - SELECT index 命令函数
    RedisSELECT命令用于选择具有指定的从零开始的数字索引的DB,新连接始终使用DB0。SELECT-返回值返回OKSELECT-语法以下是RedisSELECT命令的基本语法。redis127.0.0.1:6379>SELECTDB_INDEXSELECT-示例redis127.0.0.1:6379>SELECT1OKredis127.0.0.1:6......