用C语言解答文件中前3个问题
时间: 2024-12-02 13:17:43 浏览: 15
087 三色球问题 C语言源代码文件
针对《重庆移通学院第七届大学生程序设计大赛sol.pdf》中的前三个问题,以下是使用C语言编写的解决方案:
### A. 回文字符串
要将一个字符串变成回文字符串,并使其字典序最小,可以通过以下步骤实现:
1. 从两端向中间遍历字符串。
2. 如果两个对称位置的字符不同,则将较大的字符改为较小的字符。
3. 最终形成的字符串即为所需的回文字符串。
```c
#include <stdio.h>
#include <string.h>
void makePalindrome(char *s) {
int len = strlen(s);
for (int i = 0, j = len - 1; i < j; i++, j--) {
if (s[i] != s[j]) {
if (s[i] > s[j]) {
s[i] = s[j];
} else {
s[j] = s[i];
}
}
}
}
int main() {
char s[1001];
scanf("%s", s);
makePalindrome(s);
printf("%s\n", s);
return 0;
}
```
### B. 榫卯结构
这道题目要求检查每组部件是否有剩余。可以使用数组或哈希表来记录每种部件的数量,然后进行匹配和减少数量。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100005
typedef struct {
int count[MAXN];
} Component;
Component components[2];
void initComponents(int n) {
for (int i = 0; i < n; i++) {
components[0].count[i] = 0;
components[1].count[i] = 0;
}
}
int canBuild(int n) {
for (int i = 0; i < n; i++) {
if (components[0].count[i] > components[1].count[i]) {
return 0;
}
}
return 1;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
initComponents(n);
for (int i = 0; i < m; i++) {
int type, id;
scanf("%d %d", &type, &id);
components[type - 1].count[id]++;
}
if (canBuild(n)) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
```
### C. 逛公园
这道题目要求找出所有可能出现在最短路径上的点。可以通过两次Dijkstra算法来实现:
1. 第一次从起点出发,记录每个点到起点的最短距离。
2. 第二次从终点出发,记录每个点到终点的最短距离。
3. 枚举每个点,如果该点满足 `dist[start][i] + dist[end][i] == dist[start][end]`,则该点在最短路径上。
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>
#define MAXN 100005
#define INF INT_MAX
typedef struct {
int v, w;
} Edge;
typedef struct {
Edge edges[MAXN];
int size;
} Graph;
Graph graph[MAXN];
bool visited[MAXN];
int dist[MAXN];
void addEdge(int u, int v, int w) {
graph[u].edges[graph[u].size++] = (Edge){v, w};
}
void dijkstra(int start, int n) {
for (int i = 0; i < n; i++) {
dist[i] = INF;
visited[i] = false;
}
dist[start] = 0;
for (int i = 0; i < n; i++) {
int minDist = INF, u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < minDist) {
minDist = dist[j];
u = j;
}
}
if (u == -1) break;
visited[u] = true;
for (int k = 0; k < graph[u].size; k++) {
int v = graph[u].edges[k].v;
int weight = graph[u].edges[k].w;
if (!visited[v] && dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
}
}
}
}
int main() {
int n, m, start, end;
scanf("%d %d %d %d", &n, &m, &start, &end);
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w); // 无向图
}
dijkstra(start, n);
int *distStart = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
distStart[i] = dist[i];
}
dijkstra(end, n);
int *distEnd = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
if (distStart[i] + distEnd[i] == distStart[end]) {
printf("%d ", i);
}
}
printf("\n");
free(distStart);
free(distEnd);
return 0;
}
```
以上是C语言实现的前三个问题的解决方案。希望对你有所帮助!
阅读全文