该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有没有大佬知道这个代码的运行过程,急!!
#include
#include
#include
#define PRECISION 1E-6
#define TARGET 24
#define SIZE 4
/*
* 最终表达式由四个数、括号、运算符组成,其大小不会超过
* 5 * ( SIZE - 1 ) + SIZE * 2 + 1
*/
typedef struct {
double value;
char expression[5 * (SIZE - 1) + SIZE * 2 + 1];
} Card;
/*
* 牌堆中计算24点
*
* card 牌堆
* size 个数
*/
bool game24(Card *card, int size);
bool game24(Card *card, int size)
{
Card stack[size - 1];
/*
* 如果牌堆里只有一张牌,判断是否就是需要的目标
*/
if (size == 1) {
if (fabs(card[0].value - TARGET) < PRECISION) {
printf("%d = %s\n", TARGET, card[0].expression);
return true;
}
else {
return false;
}
}
/*
*从牌堆中任选两张牌
*/
int m, n, i, t;
for (m = 0; m < size - 1; m++) {
for (n = m + 1; n < size; n++) {
/*
* 剩余的牌放入新牌堆
*/
t = 0;
for (i = 0; i < size; i++) {
if (i != m && i != n) {
stack[t].value = card[i].value;
sprintf(stack[t].expression, "%s", card[i].expression);
t++;
}
}
/*
* 选中两张牌的和放入新牌堆
*/
stack[size - 2].value = card[m].value + card[n].value;
sprintf(stack[size - 2].expression, "(%s + %s)", card[m].expression, card[n].expression);
if (game24(stack, size - 1)) {
return true;
}
/*
* 选中两张牌的差放入新牌堆
*/
if (card[m].value > card[n].value) {
stack[size - 2].value = card[m].value - card[n].value;
sprintf(stack[size - 2].expression, "(%s - %s)", card[m].expression, card[n].expression);
}
else {
stack[size - 2].value = card[n].value - card[m].value;
sprintf(stack[size - 2].expression, "(%s - %s)", card[n].expression, card[m].expression);
}
if (game24(stack, size - 1)) {
return true;
}
/*
* 选中两张牌的积放入新牌堆
*/
stack[size - 2].value = card[m].value * card[n].value;
sprintf(stack[size - 2].expression, "%s * %s", card[m].expression, card[n].expression);
if (game24(stack, size - 1)) {
return true;
}
/*
* 选中两张牌的商放入新牌堆
*/
if (card[m].value != 0) {
stack[size - 2].value = card[n].value / card[m].value;
sprintf(stack[size - 2].expression, "%s / %s", card[n].expression, card[m].expression);
if (game24(stack, size - 1)) {
return true;
}
}
if (card[n].value != 0) {
stack[size - 2].value = card[m].value / card[n].value;
sprintf(stack[size - 2].expression, "%s / %s", card[m].expression, card[n].expression);
if (game24(stack, size - 1)) {
return true;
}
}
}
}
return false;
}
int main(void)
{
int i, poke;
Card card[SIZE];
printf("请输入4个数字 以判断解法:");
for (i = 0; i < SIZE; i++) {
scanf("%d", &poke);
card[i].value = (double)poke;
sprintf(card[i].expression, "%d", poke);
}
if (game24(card, SIZE)) {
printf("Done\n");
}
else {
printf("No Answer\n");
}
return 0;
}