FZU ACM 寒假第五讲:搜索

news/2025/2/13 20:34:46/文章来源:https://www.cnblogs.com/Lumine233/p/18714376

Problem1(Title:自然数的拆分问题 Origin:洛谷-P2404)

#include <iostream>
#include <vector>
using namespace std;void dfs(int n, int start, vector<int>& current) {if (n == 0) {if (current.size() > 1) {for (size_t i = 0; i < current.size() - 1; ++i) {cout << current[i] << "+";}cout << current.back() << endl;}return;}for (int i = start; i <= n; ++i) {current.push_back(i);dfs(n - i, i, current);current.pop_back();}
}int main() {int n;cin >> n;vector<int> current;dfs(n, 1, current);return 0;
}

Problem2(Title:填涂颜色 Origin:洛谷-P1162)

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main() {int n;cin >> n;vector<vector<int>> matrix(n + 2, vector<int>(n + 2, 0));vector<vector<bool>> visited(n + 2, vector<bool>(n + 2, false));for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {cin >> matrix[i][j];}}int dx[4] = {1, 0, -1, 0};int dy[4] = {0, 1, 0, -1};auto bfs = [&](int startX, int startY) {queue<pair<int, int>> q;q.push({startX, startY});visited[startX][startY] = true;while (!q.empty()) {auto [x, y] = q.front();q.pop();for (int i = 0; i < 4; ++i) {int nx = x + dx[i];int ny = y + dy[i];if (nx >= 0 && nx <= n + 1 && ny >= 0 && ny <= n + 1 &&!visited[nx][ny] && matrix[nx][ny] == 0) {visited[nx][ny] = true;q.push({nx, ny});}}}};for (int i = 0; i <= n + 1; ++i) {if (!visited[i][0] && matrix[i][0] == 0) bfs(i, 0);if (!visited[i][n + 1] && matrix[i][n + 1] == 0) bfs(i, n + 1);if (!visited[0][i] && matrix[0][i] == 0) bfs(0, i);if (!visited[n + 1][i] && matrix[n + 1][i] == 0) bfs(n + 1, i);}for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (matrix[i][j] == 0 && !visited[i][j]) {cout << 2 << " ";} else {cout << matrix[i][j] << " ";}}cout << endl;}return 0;
}

Problem3(Title:显示图像 Origin:洛谷-P1256)

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};const int N = 182 + 5;int n, m;
int a[N][N], d[N][N];
bool vis[N][N];bool available(int x, int y) {return x >= 1 && x <= n && y >= 1 && y <= m;
}int main() 
{cin >> n >> m;queue<pair<int, int>> Q;for (int i = 1;i <= n;i++) {for (int j = 1;j <= m;j++) {char ch;cin >> ch;a[i][j] = ch - '0';if (a[i][j] == 1) {vis[i][j] = true;Q.push({ i,j });}}}while (!Q.empty()) {int x = Q.front().first;int y = Q.front().second;Q.pop();for (int i = 0;i < 4;i++) {int nx = x + dx[i];int ny = y + dy[i];if (available(nx, ny) && ! vis[nx][ny]) {vis[nx][ny] = true;d[nx][ny] = d[x][y] + 1;Q.push({ nx,ny });}}}for (int i = 1;i <= n;i++) {for (int j = 1;j <= m;j++) {cout << d[i][j] << ' ';}cout << endl;}return 0;
}

Problem4(Title:健康的荷斯坦奶牛 Healthy Holsteins Origin:洛谷-P1460)

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>using namespace std;int v; 
vector<int> a;
int g; 
vector<vector<int>> b; 
vector<int> sum; 
vector<int> chosen; 
int min_feed_count = INT_MAX; 
vector<int> best_choice;bool is_valid() {for (int i = 0; i < v; ++i) {if (sum[i] < a[i]) {return false;}}return true;
}void dfs(int index, int feed_count) {if (feed_count >= min_feed_count) {return; }if (index == g) {if (is_valid() && feed_count < min_feed_count) {min_feed_count = feed_count;best_choice = chosen;}return;}dfs(index + 1, feed_count);for (int i = 0; i < v; ++i) {sum[i] += b[index][i];}chosen.push_back(index + 1);dfs(index + 1, feed_count + 1);chosen.pop_back();for (int i = 0; i < v; ++i) {sum[i] -= b[index][i];}
}int main() {cin >> v;a.resize(v);for (int i = 0; i < v; ++i) {cin >> a[i];}cin >> g;b.resize(g, vector<int>(v));for (int i = 0; i < g; ++i) {for (int j = 0; j < v; ++j) {cin >> b[i][j];}}sum.resize(v, 0);dfs(0, 0);cout << min_feed_count;for (int i = 0; i < min_feed_count; ++i) {cout << " " << best_choice[i];}cout << endl;return 0;
}

Problem5(Title:GRZ-Ridges and Valleys Origin:洛谷-P3456)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int n;
vector<vector<int>> map;
vector<vector<bool>> visited;
int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};bool is_valid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < n;
}void dfs(int x, int y, int height, vector<pair<int, int>>& region) {visited[x][y] = true;region.push_back({x, y});for (int i = 0; i < 8; ++i) {int nx = x + dx[i];int ny = y + dy[i];if (is_valid(nx, ny) && !visited[nx][ny] && map[nx][ny] == height) {dfs(nx, ny, height, region);}}
}int main() {cin >> n;map.resize(n, vector<int>(n));visited.resize(n, vector<bool>(n, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {cin >> map[i][j];}}int ridges = 0, valleys = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (!visited[i][j]) {vector<pair<int, int>> region;dfs(i, j, map[i][j], region);int min_height = map[i][j], max_height = map[i][j];bool is_ridge = true, is_valley = true;for (auto& p : region) {int x = p.first, y = p.second;for (int k = 0; k < 8; ++k) {int nx = x + dx[k];int ny = y + dy[k];if (is_valid(nx, ny)) {if (map[nx][ny] > max_height) {max_height = map[nx][ny];is_ridge = false;}if (map[nx][ny] < min_height) {min_height = map[nx][ny];is_valley = false;}}}}if (is_ridge) {ridges++;}if (is_valley) {valleys++;}}}}cout << ridges << " " << valleys << endl;return 0;
}

Problem6(Title:八皇后 Checker Challenge Origin:洛谷-P1219)

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
#define MAXN 1000
int a[MAXN], n, ans = 0;
int b1[MAXN], b2[MAXN], b3[MAXN];
void dfs(int x) 
{if (x > n) {ans++;if (ans <= 3) {for (int i = 1;i <= n;i++) cout << a[i] << " ";cout << endl;}return;}for (int i = 1;i<=n;i++) if (b1[i] == 0 && b2[x + i] == 0 && b3[x - i + 15] == 0) {a[x] = i;b1[i] = 1;b2[x + i] = 1;b3[x - i + 15] = 1;dfs(x + 1);b1[i] = 0;b2[x + i] = 0;b3[x - i + 15] = 0;}
}int main() 
{cin >> n;dfs(1);cout << ans << endl;return 0;
}

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

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

相关文章

寒假集训专题五:搜索

ESAY1:自然数的拆分 P2404 自然数的拆分问题 题目描述 任何一个大于 \(1\) 的自然数 \(n\),总可以拆分成若干个小于 \(n\) 的自然数之和。现在给你一个自然数 \(n\),要求你求出 \(n\) 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,…

多模态 AI 怎么玩?这里有 18 个脑洞

在 RTE 开发者社区,我们会和大家一起探索全球最前沿的 Real-Time AI 技术,和最有想法的新兴场景。Google 近期举办了一场名为「MultiModal Hackathon」的限时编程活动,聚焦于 多模态与 Gemini 2.0 的最新能力。活动汇聚了 200 多位开发者,共同探索多模态 AI、实时 AI、生成…

Svelte 最新中文文档翻译(7)—— snippet 与 @render

前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

基环树 DP:学习笔记

总述 定义 基环树,是一个 \(N\) 个点和 \(N\) 条边的连通图,特征是图中有且仅有一个环。特别的,如果不连通且每个连通块的点数和边数都相等,那么这就是一个基环树森林。 基环树 DP,顾名思义,就是在一个基环树上 DP,或是 DP 的结构类似基环树。相对于正常的树型 DP,一般…

数字孪生如何让GIS场景视效瞬间高大上?带你了解鲸孪生中的GIS系统

GIS与数字孪生的结合非常紧密,而山海鲸可视化作为一个数字孪生平台,也将GIS系统整合在了鲸孪生功能之中。 GIS中包含了大量的数据,例如遥感数据、地形数据、倾斜摄影数据等,能够为数字孪生系统提供非常好的补充。同时,传统的GIS系统整体视觉效果相对较差,与其他模型和数据…

2 分支 多个思路

利用分支,你就可以在同一个代码基础上同时处理多个完全没有关联、相互独立的工作。考虑以下场景。 假设你正在改一个 Bug-A,此时已经产生了大量的代码修改,并且离修复完成还有很长一段时间(起码得明天)。此时,有一个着急但简单的 Bug-B 需要你立即完成,并在一个小时内同…

记录一种DAG计数方法与一个配套技巧

记录一种DAG计数方法与一个配套技巧 定义 \(f_S\) 表示集合 \(S\) 中的点构成的合法 DAG 子图的方案数。假设找到 DAG 中一个入度为 \(0\) 的节点 \(x\),那么很明显 \(f_S=\sum_{x}f_{S\setminus \{x\}}\),这明显要算重因为 \(S\setminus \{x\}\) 中也有入度为 \(0\) 的点。 …

野鸡题手写题解整合

浴谷正在蒸蒸日上,专栏区怕是马上要倒闭了。 CF2026F 题 题。题外话:这场有点水平,E 题让我重拾了最大权闭合子图的记忆。 首先考虑没有这个可持久化(只有 \(2,3,4\) 操作)怎么做。\(0/1\) 背包问题,动态维护当前的 dp 数组 \(f_i\) 表示总体积 \(\sum p\) 不超过 \(i\) …

鸿蒙开发:了解@Builder装饰器

@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁前言本文代码案例基于Api13,温馨提示:内容相对来说比较简单,如果您已掌握,略过即可。如果说一个页面中组件有很多,我们都统一写到build函数中,显而易见…

P1020 [NOIP 1999 提高组] 导弹拦截(dilworth)

这道题真的做的我鬼火冒,尤其是这个第二问要用到dilworth但是我看讲解完全不知道他们在讲什么,我看了好久才理解,一个数组至少可以由几个不增子序列覆盖就等于严格单调递增的最长子序列的长度,如果是至少可以由几个严格递减子序列覆盖就等于最长单调不减子序列的长度,然后…

Linux系统介绍

1. Linux介绍 Linux和windows一样也是一个操作系统,但是与windows不同的是,Linux是一套开放源码的代码程序、并且可以自由传播的类unix操作系统软件。 Linux系统主要被应用于服务端、嵌入式开发和个人PC桌面3大领域,一般的WEB项目都是部署在Linux操作系统上。 Linux是一个基…