编辑
2024-09-20
算法题
00
请注意,本文编写于 232 天前,最后修改于 232 天前,其中某些信息可能已经过时。

今天做https://www.luogu.com.cn/problem/P2049

刚开始想到dfs,过了一个测试点,全紫

加个访问数组,防止访问重复的点

因为显而易见答案肯定在0-k

cpp
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_M 100 #define MAX_N 100 #define MAX_K 100 int M, N, K; int grid[MAX_M][MAX_N]; bool visited[MAX_M][MAX_N][MAX_K]; bool results[MAX_K]; void dfs(int x, int y, int value) { if (visited[x][y][value]) return; visited[x][y][value] = true; if (x == M - 1 && y == N - 1) { // 到达右下角,记录结果 results[value] = true; return; } // 向右走 if (y + 1 < N) { dfs(x, y + 1, (value * grid[x][y + 1]) % K); } // 向下走 if (x + 1 < M) { dfs(x + 1, y, (value * grid[x + 1][y]) % K); } } int main() { scanf("%d %d %d", &M, &N, &K); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { scanf("%d", &grid[i][j]); } } // 从左上角开始DFS dfs(0, 0, grid[0][0] % K); // 收集结果 int result_count = 0; for (int k = 0; k < K; k++) { if (results[k]) { result_count++; } } // 输出结果 printf("%d\n", result_count); for (int k = 0; k < K; k++) { if (results[k]) { printf("%d ", k); } } printf("\n"); return 0; }

还有dp解法

cpp
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_M 100 #define MAX_N 100 #define MAX_K 100 int M, N, K; int grid[MAX_M][MAX_N]; bool dp[MAX_M][MAX_N][MAX_K]; int main() { scanf("%d %d %d", &M, &N, &K); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { scanf("%d", &grid[i][j]); } } // 初始化起点 dp[0][0][grid[0][0] % K] = true; // 动态规划 for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { if (i == 0 && j == 0) continue; for (int k = 0; k < K; k++) { if (i > 0 && dp[i-1][j][k]) { dp[i][j][(k * grid[i][j]) % K] = true; } if (j > 0 && dp[i][j-1][k]) { dp[i][j][(k * grid[i][j]) % K] = true; } } } } // 收集结果 int results[MAX_K]; int result_count = 0; for (int k = 0; k < K; k++) { if (dp[M-1][N-1][k]) { results[result_count++] = k; } } // 输出结果 printf("%d\n", result_count); for (int i = 0; i < result_count; i++) { printf("%d ", results[i]); } printf("\n"); return 0; }

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!