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;
}