ACM寒假集训第五次专题任务

news/2025/2/13 23:39:47/文章来源:https://www.cnblogs.com/cytlllll/p/18714602

ACM寒假集训第五次专题任务

一、自然数的拆分问题

题目:

联想截图_20250213140102联想截图_20250213140141

解题思路:

使用了深度优先搜索,通过he判断何时输出,c标记长度控制输出,qs标记起始位置从小到大拆分。

AC代码:

#include<iostream>
using namespace std;
int n,a[10],ans;
void dfs(int he,int c,int qs)
{if(he==n){for(int i=1;i<=c-2;i++){cout<<a[i]<<'+';}cout<<a[c-1]<<endl;return;}else if(he>n){return;}for(int i=qs;i<n;i++){a[c]=i;dfs(he+i,c+1,i);}
}
int main()
{cin>>n;dfs(0,1,1);return 0;
}

二、填涂颜色

题目:

联想截图_20250213140652联想截图_20250213140821

解题思路:

使用了深度优先搜索,将所有边界的0标记成3,再将未被标记的0标记为2,从左上角开始一遍(覆盖与上边界、左边界接触的0),再右下角一遍(覆盖与下边界、右边界接触的0)。

AC代码:

#include<iostream>
#include<cstring>
using namespace std;
int n;
char a[35][35],b[35][35];
void dfs(int x,int y)
{if(a[x][y]=='1'){return;}else if((a[x+1][y]=='3'||a[x-1][y]=='3'||a[x][y+1]=='3'||a[x][y-1]=='3')&&(a[x][y]=='0'||a[x][y]=='2')){a[x][y]='3';return;}else if(a[x][y]=='0'){a[x][y]='2';dfs(x+1,y);dfs(x-1,y);dfs(x,y+1);dfs(x,y-1);}
}
int main()
{cin>>n;memset(a,'3',sizeof(a));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];b[i][j]=a[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dfs(i,j);}}for(int i=n;i>=1;i--){for(int j=n;j>=1;j--){dfs(i,j);if(a[i][j]=='2'){b[i][j]='2';}}}for(int i=1;i<=n;i++){  for(int j=1;j<=n;j++){cout<<b[i][j]<<" ";}cout<<endl;}return 0;
}

三、显示图像

题目:

联想截图_20250213144723联想截图_20250213144758联想截图_20250213144818

解题思路:

先把所有值为1的点距离设为0,再将其位置依次进队,依次扩展没有计算过距离的点,每次拓展都队头后移,那么队头到1点的距离+1就是拓展的点的距离。

AC代码:

#include<iostream>
#include<cstring>
using namespace std;
int n,m,f[200][200],d[200][200];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct node{int x,y;
}a[40000];
int tail,head;
int main()
{cin>>n>>m;memset(f,1,sizeof(f));for(int i=1;i<=n;i++){string s;cin>>s;for(int j=0;j<s.size();j++){if(s[j]=='0'){f[i][j+1]=0;}else{d[i][j+1]=0;f[i][j+1]=1;a[++tail].x=i;a[tail].y=j+1;}}}for(head=1;head<=tail;head++){for(int i=0;i<=3;i++){int xx=a[head].x+dx[i],yy=a[head].y+dy[i];if(!f[xx][yy]){d[xx][yy]=d[a[head].x][a[head].y]+1;f[xx][yy]=1;a[++tail].x=xx;a[tail].y=yy;}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<d[i][j]<<' ';}cout<<endl;}return 0;
}

四、健康的荷斯坦奶牛 Healthy Holsteins

题目:

联想截图_20250213145037联想截图_20250213145132

解题思路:

将不同种类维他命相加得出最少种类(深度优先搜索),再判断字典序。

AC代码:

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int> vec;
vector<int> ans;
const int V=30;
const int G=20;
int v,g;
int need[V];
int feed[G][V];
int cnt[V];
bool ok()
{for(int i=1;i<=v;i++){if(cnt[i]<need[i])return false;}return true;
}
void dfs(int k)
{if(ok()){if(ans.empty()){ans=vec;}else if(ans.size()>vec.size()){ans=vec;}else if(ans.size()==vec.size()&&vec<ans){ans=vec;}return;}if(k>g){return;}vec.push_back(k);for(int i=1;i<=v;i++){cnt[i]+=feed[k][i];}dfs(k+1);vec.pop_back();for(int i=1;i<=v;i++){cnt[i]-=feed[k][i];}dfs(k+1);
}
int main()
{cin>>v;for(int i=1;i<=v;i++){cin>>need[i];}cin>>g;for(int i=1;i<=g;i++){for(int j=1;j<=v;j++){cin>>feed[i][j];}}dfs(1);cout<<ans.size()<<' ';for(const auto& el:ans){cout<<el<<' ';}return 0;
}

五、GRZ-Ridges and Valleys

题目:

联想截图_20250213223950联想截图_20250213224003联想截图_20250213224015

解题思路:

依次搜索连通块周围数字与连通块中数字的大小关系,先假设既是山峰又是山谷,再排除,最后输出结果。

AC代码:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n;
int dx[]={0,1,0,-1,1,1,-1,-1};
int dy[]={1,0,-1,0,1,-1,1,-1};
int a[1009][1009];
int rcount,vcount;
bool vis[1009][1009];
bool available(int x,int y)
{return x>=1&&x<=n&&y>=1&&y<=n;
}
void bfs(int sx,int sy)
{bool isr=true;bool isv=true;queue<pair<int,int>>Q;vis[sx][sy]=true;Q.push({sx,sy});while(!Q.empty()){int x=Q.front().first;int y=Q.front().second;Q.pop();for(int i=0;i<8;i++){int nx=x+dx[i];int ny=y+dy[i];if(available(nx,ny)){if(a[nx][ny]==a[x][y]&&!vis[nx][ny]){vis[nx][ny]=true;Q.push({nx,ny});}if(a[nx][ny]<a[x][y]){isv=false;}if(a[nx][ny]>a[x][y]){isr=false;}}}}if(isr){rcount++;}if(isv){vcount++;}
}
int main()
{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(!vis[i][j]){bfs(i,j);}}}cout<<rcount<<' '<<vcount;return 0;
}

六、八皇后 Checker Challenge

题目:

联想截图_20250213145817联想截图_20250213145843

解题思路:

从第一行开始,用行、列、对角线、副对角线进行限制,并对所在行、列、对角线、副对角线进行标记,被标记的行、列、对角线、副对角线不再放棋子。

AC代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=15;
int n,y[N],d1[2*N],d2[2*N];
vector<int>v;
vector<vector<int>>ans;
void dfs(int i)
{if(i>n){ans.push_back(v);return;}for(int j=1;j<=n;j++){if(y[j]==0&&d1[i-j+n]==0&&d2[i+j]==0){y[j]++;d1[i-j+n]++;d2[i+j]++;v.push_back(j);dfs(i+1);v.pop_back();y[j]--;d1[i-j+n]--;d2[i+j]--;}}
}
int main()
{cin>>n;dfs(1);sort(ans.begin(),ans.end());for(int i=0;i<3;i++){for(const auto& el:ans[i]){cout<<el<<' ';}cout<<endl;}cout<<ans.size();return 0;
}

学习总结

深度优先搜索(DFS)与 广度优先搜索(BFS

图形理解:图的深度优先遍历/深度优先搜索和图的广度优先遍历/广度优先搜索

运用和代码实现:动画演示什么是深搜和广搜 怎么入门搜索算法 这个视频告诉你

对比

特性 深度优先搜索(DFS 广度优先搜索(BFS
实现方式 递归或栈 队列
空间复杂度 较小 较大
适用问题 找到所有可能解、需要回溯的问题 最短路径、最短距离问题
搜索顺序 深入一条路径到底,然后回溯 逐层扩展,先访问所有相邻节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeekR1+Cherry Studio使用白嫖API和开源软件使用满血版模型!

使用Ollama本地运行,使用Ollama+ChatWise可视化运行,使用Ollama+ChatWise在Macbook Air M1 上运行。今天再来说一个方案。这个方案不是完全离线,但是模型能力会比离线的强。可以完全免费尝试,有几百到几千万的Token可以用。可以缓解DeepSeek R1官方服务繁忙无法使用的问题。…

DeepSeekR1 苹果macbook M1本地可视化运行!

过年了,就带了一台 macbook air 8g,DeepSeekR1的消息还是铺天盖地的来,我就想着在这台电脑上也装一个吧。经过简单的配置,最终也运行起来了,速度还可以。我这是首款M系列笔记本,也是现在最低配的 M 系列笔记本。这也就意味着所有M系列的苹果电脑都可以轻松运行DeepSeekR1…

11.A星寻路算法

14.A星寻路算法 题目 迷宫寻路需求,在一个迷宫游戏中,有一些怪物攻击主角,现在希望小怪物,能自动绕过迷宫中的障碍物,寻找到主角的所在。 思路 A星寻路算法(A*search algorithm),是一种用于寻找有效路径的算法。 简单的场景举例(简化问题),看一看A星寻路算法的工作过程。…

人間になりたい。

さよならはエモーション 僕は行く ずっと涙こらえ こらえ 忘れてたエモーション 僕は行く ずっと深い霧の 霧の向こうへ『……组建过,那就好。』 属于我的 Crychic,就在那个寒假啊。 或许更早些,始于一次英语单元测同时爆炸了的三个人,经过一次精彩地赶在元旦零点钟声前分解…

【THM】Security Principles(安全原则)-学习

了解安全三元组以及常见的安全模型和原则。本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/securityprinciples 本文相关内容:了解安全三元组以及常见的安全模型和原则。介绍 网络安全已成为一个流行词;每家公司都声称其网络产品或网络服务是安全的,但事实上…

小米 R3G 路由器刷机教程(Pandavan)

小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而,原厂固件的功能相对有限,难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能,还能通过第三方固件实现更丰富的功能,如 DNS 解析、KMS 服务器、USB 管理等。本文旨在为小米 R3G 路由器用户提供详细的刷…

windows知道服务器的内网IP地址如何查看服务器的计算机名称

windows知道服务器的内网IP地址如何查看服务器的计算机名称windows知道服务器的内网IP地址如何查看服务器的计算机名称 nbtstat百度百科 https://baike.baidu.com/item/nbtstat/7578115 windows在局域网内查看ip地址对应的计算机名或者根据计算机名查ip https://blog.csdn.net/…

C++ 使用MIDI库演奏《晴天》

那些在MIDI库里徘徊的十六分音符 终究没能拼成告白的主歌我把周杰伦的《晴天》写成C++的类在每个midiEvent里埋藏故事的小黄花调试器的断点比初恋更漫长而青春不过是一串未导出的cmake工程文件在堆栈溢出的夜晚终将明白有些旋律永远停在#pragma once的注释里有些人永远停在未定…

JUC并发—2.Thread源码分析及案例应用

大纲 1.什么是线程以及并发编程 2.微服务注册中心案例 3.以工作线程模式开启微服务的注册和心跳线程 4.微服务注册中心的服务注册功能 5.微服务注册中心的心跳续约功能 6.微服务的存活状态监控线程 7.以daemon模式运行微服务的存活监控线程 8.一般不常用到的ThreadGroup是什么 …

HashMap 的 put 方法源码分析(JDK 1.8)

一、HashMap 的 put 方法源码分析(JDK 1.8) 以下是 HashMap 的 put 方法的源码(JDK 1.8):hash(key) 方法 hash(key) 方法用于计算键的哈希值:如果键为 null,返回 0。否则,返回键的哈希码与高 16 位的异或结果(目的是减少哈希冲突)。putVal 方法 putVal 方法是 HashMa…

第二章笔记

2.1用二进制数表示计算机信息的原因 IC的所有引脚,只有直流电压0V或5V 两个状态。也就是说,IC的一个引脚,只能表示两个状态。 计算机处理信息的最小单位——位,就相当于二进制中的一位。位的英文bit是二进制数位(binary digit)的缩写。 二进制数的位数一般是8位、16位、3…