利用分支限界法解决1-9之间添加"+"或"-"或""使得运算结果为100的问题的c语言的代码
时间: 2023-07-19 15:43:50 浏览: 115
以下是利用分支限界法解决1-9之间添加"+"或"-"或""使得运算结果为100的问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
typedef struct node {
int value;
char exp[MAX_LEN];
} Node;
int cmp(const void *a, const void *b) {
Node *na = (Node *)a;
Node *nb = (Node *)b;
return abs(100 - na->value) - abs(100 - nb->value);
}
Node *solve() {
Node *nodes = malloc(sizeof(Node) * MAX_LEN);
int front = 0, rear = 0;
nodes[rear++] = (Node){1, "1"};
nodes[rear++] = (Node){-1, "-1"};
nodes[rear++] = (Node){0, "1-1"};
while (front < rear) {
Node node = nodes[front++];
if (node.value == 100) {
return &node;
}
if (strlen(node.exp) < 9) {
int len = strlen(node.exp);
nodes[rear++] = (Node){node.value + len + 1, ""};
snprintf(nodes[rear - 1].exp, MAX_LEN, "%s+%d", node.exp, len + 1};
nodes[rear++] = (Node){node.value - len - 1, ""};
snprintf(nodes[rear - 1].exp, MAX_LEN, "%s-%d", node.exp, len + 1};
nodes[rear++] = (Node){node.value - len - 1 + (len + 1) * 10, ""};
snprintf(nodes[rear - 1].exp, MAX_LEN, "%s %d", node.exp, len + 1};
}
qsort(nodes + front, rear - front, sizeof(Node), cmp);
}
return NULL;
}
int main() {
Node *result = solve();
if (result == NULL) {
printf("No solution found\n");
} else {
printf("Value: %d, Expression: %s\n", result->value, result->exp);
}
return 0;
}
```
这段代码定义了一个`Node`结构体,表示当前的值和表达式。使用了一个数组`nodes`来存储待扩展的节点,使用`front`和`rear`分别表示数组的头和尾。在每次扩展节点时,分别计算加、减、连接的三种情况,并将其作为新的节点放入数组中。如果当前节点的值等于100,则返回该节点;否则,继续扩展数组中的下一个节点,直到找到解或数组为空。在每次扩展节点后,使用`qsort`函数对数组进行排序,按照节点距离100的绝对值从小到大排序。
阅读全文