假设小艺酱家到学校是一个n*n的矩阵。 每个格子包含一个诱惑值p,诱惑着小艺,让她迟到。 小艺位于矩阵的左上角,学校在矩阵的右下角落。 小艺想知道自己到达学校所要经历的最小诱惑值是?第一行输入整数n。(1<=n<=100) 以下n行每行有n个整数表示诱惑值。(1<=p<=100)输出到达学校需要经历的最小诱惑值。。用C语言程序实现
时间: 2023-04-03 16:02:39 浏览: 365
很高兴回答你的问题。这是一个算法问题,我可以回答。根据题目描述,这是一个最短路径问题,可以使用Dijkstra算法来解决。具体实现方法如下:
1. 定义一个二维数组dist,表示从起点到每个点的最小诱惑值,初始化为无穷大。
2. 定义一个一维数组visited,表示每个点是否已经被访问过,初始化为false。
3. 将起点的dist值设为0。
4. 重复以下步骤n次(n为矩阵的大小):
a. 找到未访问过的dist值最小的点,将其标记为已访问。
b. 更新与该点相邻的点的dist值,如果更新后的dist值比原来的小,则更新dist值。
5. 最终dist数组中右下角的值即为所求的最小诱惑值。
下面是C语言程序实现:
#include <stdio.h>
#include <limits.h>
#define MAX_N 100
int n;
int p[MAX_N][MAX_N];
int dist[MAX_N][MAX_N];
bool visited[MAX_N][MAX_N];
int minDist() {
int minDist = INT_MAX;
int minI = -1, minJ = -1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j] && dist[i][j] < minDist) {
minDist = dist[i][j];
minI = i;
minJ = j;
}
}
}
return minI * n + minJ;
}
void updateDist(int i, int j, int di, int dj) {
if (di < 0 || di >= n || dj < 0 || dj >= n) {
return;
}
int newDist = dist[i][j] + p[di][dj];
if (newDist < dist[di][dj]) {
dist[di][dj] = newDist;
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &p[i][j]);
dist[i][j] = INT_MAX;
visited[i][j] = false;
}
}
dist[0][0] = p[0][0];
for (int k = 0; k < n * n; k++) {
int minIndex = minDist();
int i = minIndex / n;
int j = minIndex % n;
visited[i][j] = true;
updateDist(i, j, i - 1, j);
updateDist(i, j, i + 1, j);
updateDist(i, j, i, j - 1);
updateDist(i, j, i, j + 1);
}
printf("%d\n", dist[n - 1][n - 1]);
return 0;
}
阅读全文