#include<iostream>#include<algorithm>#include<cstring>usingnamespace std;
constint N = 25;
int a[N];
int n, k;
longlong ans = 0; // 计算素数的数量boolis_prime(int x){
if (x < 2) returnfalse;
for (int i = 2; i <= x / i; i++) {
if (x % i == 0) returnfalse;
}
returntrue;
}
voiddfs(int u, int ind, int sum){
if (u == k) {
if (is_prime(sum)) ans++;
return;
}
for (int i = ind; i <= n; i++) {
dfs(u + 1, i + 1, sum + a[i]);
}
}
intmain(){
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
dfs(0, 1, 0);
printf("%lld\n", ans);
return0;
}
#include<iostream>usingnamespace std;
constint N = 7;
int g[N][N];
int n, m, t, sx, sy, ex, ey;
int ans = 0; // 记录方法的数量int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
voiddfs(int x, int y){
if (x == ex && y == ey) {
ans++;
return;
}
g[x][y] = 0; // 表示当前点遍历过for (int i = 0; i < 4; i++) {
int dx = x + dir[i][0], dy = y + dir[i][1];
if (g[dx][dy] == 0) continue;
dfs(dx, dy);
}
g[x][y] = 1;
}
intmain(){
cin >> n >> m >> t;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) g[i][j] = 1;
}
cin >> sx >> sy >> ex >> ey;
for (int i = 0; i < t; i++) {
int x, y;
cin >> x >> y;
g[x][y] = 0;
}
dfs(sx, sy);
cout << ans << "\n";
return0;
}
因此需要注意的是:应该是写成 if (dfs(board, word, i, j, 0)) return true;,而不是 return dfs(board, word, i, j, 0);
代码如下:
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int n, m;
bool st[505][505];
booldfs(vector<vector<char>>& board, string word, int x, int y, int pos){
if (pos == word.size()) returntrue;
// 向量的方式,定义上下左右四个位置for (int i = 0; i < 4; i++) {
int dx = x + dir[i][0], dy = y + dir[i][1];
if (dx >= 0 && dx < n && dy >= 0 && dy < m && board[dx][dy] == word[pos] && !st[dx][dy]) {
st[dx][dy] = true;
if (dfs(board, word, dx, dy, pos + 1)) returntrue;
st[dx][dy] = false;
}
}
returnfalse;
}
boolexist(vector<vector<char>>& board, string word){
n = board.size(), m = board[0].size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == word[0]) {
st[i][j] = true;
if (dfs(board, word, i, j, 1)) returntrue;
st[i][j] = false;
}
}
}
returnfalse;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
intnearestExit(vector<vector<char>>& maze, vector<int>& entrance){
int n = maze.size(), m = maze[0].size();
queue<pair<int, int>> q;
q.push({entrance[0], entrance[1]});
vector<vector<int>> vis(n, vector<int>(m));
vis[entrance[0]][entrance[1]] = true;
int ans = 0;
while (!q.empty()) {
ans++;
int size = q.size();
while (size--) {
auto [x, y] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int dx = x + dir[k][0], dy = y + dir[k][1];
if (dx >= 0 && dx < n && dy >= 0 && dy < m && !vis[dx][dy] && maze[dx][dy] == '.') {
if (dx == 0 || dx == n - 1 || dy == 0 || dy == m - 1) return ans;
q.push({dx, dy});
vis[dx][dy] = true;
}
}
}
}
return-1;
}
int m, n;
bool vis[55][55];
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
intbfs(vector<vector<int>>& forest, int bx, int by, int ex, int ey){
if (bx == ex && by == ey) return0;
queue<pair<int, int>> q;
memset(vis, 0, sizeof(vis));
q.push({bx, by});
vis[bx][by] = true;
int step = 0;
while (!q.empty()) {
step++;
int size = q.size();
while (size--) {
auto [a, b] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int x = a + dir[i][0], y = b + dir[i][1];
if (x >= 0 && x < n && y >= 0 && y < m && forest[x][y] && !vis[x][y]) {
if (x == ex && y == ey) return step;
q.push({x, y});
vis[x][y] = true;
}
}
}
}
return-1;
}
intcutOffTree(vector<vector<int>>& forest){
// 1. 找出砍树顺序 (从小到大)
n = forest.size(), m = forest[0].size();
vector<pair<int, int>> trees;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (forest[i][j] > 1) {
trees.push_back({i, j});
}
}
}
sort(trees.begin(), trees.end(), [&](const pair<int, int> x, const pair<int, int> y) {
return forest[x.first][x.second] < forest[y.first][y.second];
});
// 2. 按照顺序砍树 -- 相邻树的最短距离int bx = 0, by = 0;
int ret = 0;
for (auto& [a, b] : trees) {
int step = bfs(forest, bx, by, a, b);
if (step == -1) return-1;
ret += step;
bx = a, by = b;
}
return ret;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
intnumEnclaves(vector<vector<int>>& grid){
int n = grid.size(), m = grid[0].size();
vector<vector<bool>> vis(n, vector<bool>(m));
queue<pair<int, int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if ((i == 0 || i == n - 1 || j == 0 || j == m - 1) && grid[i][j] == 1) {
q.push({i, j});
vis[i][j] = true;
}
}
}
while (!q.empty()) {
auto [a, b] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int x = a + dir[k][0], y = b + dir[k][1];
if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] && grid[x][y] == 1) {
q.push({x, y});
vis[x][y] = true;
}
}
}
int ret = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1 && !vis[i][j]) ret++;
}
}
return ret;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
int n = isWater.size(), m = isWater[0].size();
vector<vector<int>> dist(n, vector<int>(m, -1));
queue<pair<int, int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (isWater[i][j]) {
dist[i][j] = 0;
q.push({i, j});
}
}
}
while (!q.empty()) {
auto [a, b] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int x = a + dir[k][0], y = b + dir[k][1];
if (x >= 0 && x < n && y >= 0 && y < m && dist[x][y] == -1) {
dist[x][y] = dist[a][b] + 1;
q.push({x, y});
}
}
}
return dist;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
intmaxDistance(vector<vector<int>>& grid){
int n = grid.size(), m = grid[0].size();
vector<vector<int>> dist(n, vector<int>(m, -1));
queue<pair<int, int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j]) { // 所有陆地
dist[i][j] = 0;
q.push({i, j});
}
}
}
int ret = -1;
while (!q.empty()) {
auto [a, b] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int x = a + dir[k][0], y = b + dir[k][1];
if (x >= 0 && x < n && y >= 0 && y < m && dist[x][y] == -1) {
dist[x][y] = dist[a][b] + 1;
q.push({x, y});
ret = max(ret, dist[x][y]);
}
}
}
return ret;
}
boolcanFinish(int numCourses, vector<vector<int>>& prerequisites){
vector<vector<int>> adj(numCourses);
vector<int> d(numCourses, 0);
queue<int> q;
for (auto e : prerequisites) {
int u = e[0], v = e[1];
adj[u].emplace_back(v);
d[v]++;
}
for (int i = 0; i < numCourses; i++) {
if (d[i] == 0) q.push(i);
}
int cnt = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
cnt++;
for (auto v : adj[u]) {
if (--d[v] == 0) q.push(v);
}
}
return cnt == numCourses;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
typedef pair<int, int> PII;
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
int target = image[sr][sc];
if (target == color) return image;
int m = image.size(), n = image[0].size();
queue<PII> q;
q.push({sr, sc});
while (!q.empty()) {
auto [a, b] = q.front();
q.pop();
image[a][b] = color;
for (int i = 0; i < 4; i++) {
int x = a + dir[i][0], y = b + dir[i][1];
if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == target) {
q.push({x, y});
}
}
}
return image;
}
BFS 方法如下:
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
typedef pair<int, int> PII;
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
int target = image[sr][sc];
if (target == color) return image;
int m = image.size(), n = image[0].size();
queue<PII> q;
q.push({sr, sc});
while (!q.empty()) {
auto [a, b] = q.front();
q.pop();
image[a][b] = color;
for (int i = 0; i < 4; i++) {
int x = a + dir[i][0], y = b + dir[i][1];
if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == target) {
q.push({x, y});
}
}
}
return image;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int n, m;
bool vis[505][505]; // 标记该点是否用过voiddfs(vector<vector<char>>& grid, int x, int y){
vis[x][y] = true;
for (int i = 0; i < 4; i++) {
int dx = x + dir[i][0], dy = y + dir[i][1];
if (dx >= 0 && dx < m && dy >= 0 && dy < n && !vis[dx][dy] && grid[dx][dy] == '1') {
dfs(grid, dx, dy);
}
}
}
intnumIslands(vector<vector<char>>& grid){
m = grid.size(), n = grid[0].size();
int ret = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!vis[i][j] && grid[i][j] == '1') {
ret++;
dfs(grid, i, j);
}
}
}
return ret;
}
BFS 方法如下:
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
bool vis[305][305];
int m, n;
voidbfs(vector<vector<char>>& grid, int i, int j){
queue<pair<int, int>> q;
q.push({i, j});
vis[i][j] = true;
while (q.size()) {
auto [a, b] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int x = a + dir[k][0], y = b + dir[k][1];
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y]) {
q.push({x, y});
vis[x][y] = true;
}
}
}
}
intnumIslands(vector<vector<char>>& grid){
m = grid.size(), n = grid[0].size();
int ret = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1' && !vis[i][j]) {
ret++;
bfs(grid, i, j); // 把这块陆地全部标记一下
}
}
}
return ret;
}
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int n, m, cnt;
bool vis[505][505]; // 标记该点是否用过voiddfs(vector<vector<int>>& grid, int x, int y){
vis[x][y] = true;
cnt++; // 记录每块岛屿的面积for (int i = 0; i < 4; i++) {
int dx = x + dir[i][0], dy = y + dir[i][1];
if (dx >= 0 && dx < m && dy >= 0 && dy < n && !vis[dx][dy] && grid[dx][dy] == 1) {
dfs(grid, dx, dy);
}
}
}
intmaxAreaOfIsland(vector<vector<int>>& grid){
m = grid.size(), n = grid[0].size();
int ret = 0; // 统计最大数量for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!vis[i][j] && grid[i][j] == 1) {
cnt = 0;
dfs(grid, i, j);
ret = max(cnt, ret);
}
}
}
return ret;
}
BFS 方法如下:
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
bool vis[51][51];
int m, n;
intbfs(vector<vector<int>>& grid, int i, int j){
int count = 0;
queue<pair<int, int>> q;
q.push({i, j});
vis[i][j] = true;
count++;
while (q.size()) {
auto [a, b] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int x = a + dir[k][0], y = b + dir[k][1];
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y]) {
q.push({x, y});
vis[x][y] = true;
count++;
}
}
}
return count;
}
intmaxAreaOfIsland(vector<vector<int>>& grid){
m = grid.size(), n = grid[0].size();
int ret = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1 && !vis[i][j]) {
ret = max(ret, bfs(grid, i, j));
}
}
}
return ret;
}