首页 > 其他分享 >暑假训练第四周周报

暑假训练第四周周报

时间:2024-08-11 15:38:48浏览次数:17  
标签:return && 训练 int vis 暑假 front 周报 105

总体情况

这一周学习了最近公共祖先,并且了解了dijkstra的模板,也在比赛中补了一些最短路的题,然后图的专题还没开始刷,这一周把搜索和搜索剪枝的专题差不多写完了,对dfs的各种代码实现更加深入了,但是搜索是一大块内容,涉及的题目多样经典。我想着后面对这些题再慢慢分个类,不然真正比赛的时候还是没有办法写出来。

联通块类的搜索
模拟战役

点击查看代码
/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long

using namespace std;
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[8]={0,0,1,-1,1,-1,1,-1};
int dy[8]={1,-1,0,0,1,-1,-1,1};

int m,dri;//dri为司机拥有的联通块数目
char c[10][105];//地图
bool vis[10][105];//标记
int cnt[105*105];//存齐齐每个连通块大炮的数目,因为要用来贪心
bool ck1(int x,int y)
{
    return x>=1&&x<=4&&y>=1&&y<=m;
}

bool ck2(int x,int y)
{
    return x>4&&x<=8&&y>=1&&y<=m;
}

//计算了司机的联通块数目,也就是一个大炮被攻击时产生的连锁反应
void bfs1(int i,int j)
{
    vis[i][j]=1;
    queue<pii> q;
    q.push({i,j});
    while(!q.empty())
    {
        int x=q.front().first,y=q.front().second;
        q.pop();
        for(int i=0;i<8;i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(ck1(nx,ny)&&!vis[nx][ny]&&c[nx][ny]=='*')
            {
                q.push({nx,ny});
                vis[nx][ny]=1;
            }
            
        }
    }
    
}
//计算齐齐的连通块数目,和连通块数目里大炮的个数
int bfs2(int i,int j)
{
    int res=0;
    vis[i][j]=1;
    queue<pii>q;
    q.push({i,j});
    while(!q.empty())
    {
        int x=q.front().first,y=q.front().second;
        res++;//要放在这里,不然会少算
        q.pop();
        for(int i=0;i<8;i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(ck2(nx,ny)&&!vis[nx][ny]&&c[nx][ny]=='*'){
                //res++;//错了
                vis[nx][ny]=1;
                q.push({nx,ny});
            }
        }
    }
    
    return res;
    
}




void solve()
{
    cin>>m;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=m;j++) cin>>c[i][j];
    }
    
    for(int i=1;i<=4;i++){
        for(int j=1;j<=m;j++)
        {
            if(c[i][j]=='*'&&!vis[i][j]) bfs1(i,j),dri++;
        }
    }
    
    
    int p=0;
    for(int i=5;i<=8;i++)
    {
        for(int j=1;j<=m;j++){
            if(c[i][j]=='*'&&!vis[i][j]) {
                 cnt[++p]=bfs2(i,j);
            }
        }
    }
    
   /* cout<<dri<<" "<<p<<endl;
    
    for(int i=1;i<=p;i++) cout<<cnt[i]<<" ";
    cout<<endl;*/
    
    sort(cnt+1,cnt+p+1);
    if(dri>p) {
        cout<<-1<<endl;
        return ;
    }
    int ans=0;
    for(int i=dri;i<=p;i++) ans+=cnt[i];
    cout<<ans;
    
}




signed main()
{
     std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    int t=1; 
    //cin>>t;
    
    while(t--)
    {
        solve();
    }
    

}







三维的bfs
Jelly

点击查看代码
/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long

using namespace std;
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[]={0,1,0,-1,0,0};
int dy[]={1,0,-1,0,0,0};
int dz[]={0,0,0,0,1,-1};
int n; 
char c[105][105][105];
bool vis[105][105][105];
int  foot[105][105][105];
//三维bfs模版题
bool ck(int x,int y,int z)
{
    return x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n;
}

typedef struct{
    int aa;
    int bb;
    int cc;
}three;

int ans;
int  bfs(int i,int j,int k)
{
   queue<three>q;
   vis[i][j][k]=1;
    
   q.push({i,j,k});
   while(!q.empty())
   {
       int x=q.front().aa,y=q.front().bb,z=q.front().cc;
       q.pop();
       for(int i=0;i<6;i++)
       {
           int nx=x+dx[i],ny=y+dy[i],nz=z+dz[i];
           if(ck(nx,ny,nz)&&!vis[nx][ny][nz]&&c[nx][ny][nz]!='*')
           {
               q.push({nx,ny,nz});
               vis[nx][ny][nz]=1;
               foot[nx][ny][nz]=foot[x][y][z]+1;
           }
           
           
       }
       
   }
   return foot[n][n][n];
   
   
}


void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
         for(int k=1;k<=n;k++) cin>>c[i][j][k];
         
     ans= bfs(1,1,1)+1;//记得+1,虽然题目说第一个不算,但是不知道为啥+1就过了
    if(ans!=1)    cout<<ans;  
    else cout<<-1;
    
}




signed main()
{
     std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    int t=1; 
    //cin>>t;
    
    while(t--)
    {
        solve();
    }
    

}








涉及到无限的搜索
送外卖

点击查看代码
/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long

using namespace std;
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[]={0,1,0,-1,0,0};
int dy[]={1,0,-1,0,0,0};
int dz[]={0,0,0,0,1,-1};

bool vis[100005],st[100005];
 vector<pii>ve;
char ans[100005];
int n;
int fla;//看有没有符合的字符串

bool  dfs(int x,int deep)
{
   if(x<0||x>n-1) return 0;
   if(x==n-1)
   {
       ans[deep]='\0';
       return 1;
   }
   
   if(vis[x])
   {
       st[x]=1;
       return 0;
   }
   
   vis[x]=1;
   //走第一条路
   if(dfs(x+ve[x].first,deep+1))
   {
       ans[deep]='a';
       if(st[x]) fla=1;//说明在一条路径中出现了死循环
       return true;
   }
   //走第二条路
   if(dfs(x+ve[x].second,deep+1))
   {
       ans[deep]='b';
       if(st[x]) fla=1;
       return true;
   }
  
    return 0;
    
}

//dfs找到的结果自然就是最小的
void solve()
{
     cin>>n;
   
    vector<int>a(n),b(n);
    for(auto &t:a) cin>>t;
    for(auto &t:b) cin>>t;
    for(int i=0;i<n;i++)
    {
        ve.push_back({a[i],b[i]});
    }
    if(dfs(0,0)){
        if(fla) cout<<"Infinity!";
        else   cout<<ans;
    }else 
        cout<<"No solution!";
}




signed main()
{
     std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    int t=1; 
    //cin>>t;
    
    while(t--)
    {
        solve();
    }
    

}








经典数独dfs
数独挑战

标签:return,&&,训练,int,vis,暑假,front,周报,105
From: https://www.cnblogs.com/swjswjswj/p/18353483

相关文章

  • 2024牛客暑期多校训练营7 DK
    来源:2024牛客暑期多校训练营7做题时间:2024_08_06DIntervalSelection标签:线段树、[[扫描线]]、枚举题意区间的每个数字的数量是\(k\)的定义为好区间比如\(k=2\),数组为\({1,1,2,3,2,3,1}\)对于\([3,6]\)和\([1,6]\)等都符合要求(下标从1开始)求所有好区间的数量,比如案......
  • OpenCV的级联分类器训练
    使用增强级联的弱分类器包括两个主要阶段:训练和检测阶段。对象检测教程中有描述使用基于HAAR或LBP模型的检测阶段。这里主要介绍训练增强分类器级联所需的功能,包括:准备训练数据、执行实际模型训练、可视化训练。目录一、训练数据准备1、负样本2、正样本3、命令行参数......
  • [赛记] 暑假集训CSP提高模拟17
    符号化方法初探100pts签到题?做了得有1.5h+;考虑全是正数或全是负数的情况,那么我们可以对其做一次类似于前缀和或后缀和的操作,需要$n-1$次;所以我们只需将数列中的数全部转化成正数或负数即可,具体地,找出所有正数的和和所有负数的和,如果前者比后者要大,那么就将所有正数加起......
  • 【非侵入式负载监测】低采样率电动汽车充电的无训练非侵入式负载监测(Matlab代码实现)
     ......
  • 【状态估计】【扩展卡尔曼滤波算法的神经网络训练】BP神经网络、扩展卡尔曼滤波EKF+BP
    ......
  • 【非侵入式负载监测】低采样率电动汽车充电的无训练非侵入式负载监测(Matlab代码实现)
     ......
  • 24-暑假软件工程周报(6)
    HDFS主要包括NameNode、DataNode、SecondaryNameNode,在HDFS中主要进行的是数据的存取,而在MapReduce中进行的是数据的处理。总结一下它们的过程如下:HDFS的读流程:当客户端发送读请求后,通过DistributedFileSystemAPI调用open函数,发送请求到NN节点获得block的位置信息,NN返回block的......
  • 暑假学习Java第六周
    这周我学习了cmd的基础语言,在Java编程语言中,"CMD"主要指的是命令行接口,它允许开发者通过命令行窗口执行各种操作系统级的任务。Java标准类库中提供了一些用于在命令行界面中执行命令的类和接口,最主要的是 Runtime 类和 ProcessBuilder 类。这些类使得从Java应用程序中启动其......
  • 【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识
    【书生大模型实战营(暑假场)闯关材料】入门岛:第1关Linux基础知识1.使用VScode进行SSH远程连接服务器2.端口映射及实例参考文献这一博客主要介绍使用VScode进行服务器远程连接及端口映射。1.使用VScode进行SSH远程连接服务器安装VScode,添加extensionRemote-SSH。......
  • 暑假集训CSP提高模拟17
    \[暑假集训CSP提高模拟\operatorname{EIJ}_{2}(6)-1\]\(\operatorname{EIJ}_{k}(A)\)定义为有\(A\)个球,\(k\)个盒子,盒子相同,球不同,把全部球放入的方案数Hint易知\(\operatorname{EIJ}_k(A)=\dfrac{A^k}{k!}\),详见这篇文章其实我觉得构造的过程更有意思:对一个给定的正......