#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LEFT -1
#define RIGHT -2
#define MUL -3
#define ADD -4
#define SUB -5
#define OP -6
#define NONE -10
char a[100];
int b[100];
int best[100];
int op[30];
int bn;
int iLeft;
int apos, bpos, opos;
int possible;
void space() {
while (a[apos] && (a[apos] == ' '))
apos++;
}
int compute();
int bracket() {
int sum;
if (b[bpos] == LEFT) {
bpos++;
sum = compute();
bpos++;
}
else
sum = b[bpos++];
return sum;
}
int compute() {
int sum = bracket();
while (b[bpos] == MUL || b[bpos] == ADD || b[bpos] == SUB) {
int operation = b[bpos++];
int ret = bracket();
switch (operation) {
case MUL: sum *= ret; break;
case ADD: sum += ret; break;
case SUB: sum -= ret; break;
}
}
return sum;
}
void backtrack(int dep) {
if (possible) return;
int i;
if (dep==opos) {
bpos = 0;
int iRight = compute();
if (iRight == iLeft) {
possible = 1;
for (i=0; i<bn; i++)
best[i] = b[i];
}
return;
}
b[op[dep]] = MUL; backtrack(dep+1);
b[op[dep]] = ADD; backtrack(dep+1);
b[op[dep]] = SUB; backtrack(dep+1);
}
void print(int *q) {
printf("%d=", iLeft);
int i;
for (i=0; i<bn; i++)
switch (q[i]) {
case ADD: printf("+"); break;
case MUL: printf("*"); break;
case SUB: printf("-"); break;
case LEFT: printf("("); break;
case RIGHT: printf(")"); break;
case OP: printf("?"); break;
default: printf("%d", q[i]); break;
}
}
int main() {
int iCase = 0;
int i;
while (gets(a) && strchr(a, '=')) {
possible = 0;
for (i=0; i<90; i++)
b[i] = NONE;
apos = 0;
sscanf(a, "%d", &iLeft);
while (a[apos] && isdigit(a[apos])) apos++;
space();
apos ++;
bn = 0;
opos = 0;
while (space(), a[apos]) {
if (a[apos] == '(') {
b[bn++] = LEFT;
apos++;
continue;
}
if (a[apos] == ')') {
b[bn++] = RIGHT;
apos++;
}
else {
sscanf(a+apos, "%d", &b[bn++]);
while (a[apos] && isdigit(a[apos])) apos++;
}
space();
if (a[apos] && a[apos] != ')') {
op[opos++] = bn;
b[bn++] = OP;
}
}
backtrack(0);
printf("Equation #%d:\n", ++iCase);
if (bn==1 && iLeft == b[0])
printf("%d=%d\n", iLeft,iLeft);
else if (bn==0 || !possible)
printf("Impossible\n");
else {
print(best);
printf("\n");
}
printf("\n");
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
ACM国际大学生程序设计竞赛题解(1)源代码(赵端阳袁鹤版)
共96个文件
c:66个
cpp:20个
gif:5个
4星 · 超过85%的资源 需积分: 0 53 下载量 12 浏览量
2011-03-25
20:02:08
上传
评论 3
收藏 142KB RAR 举报
温馨提示
acm 赵端阳 zoj zju 源代码 题解
资源推荐
资源详情
资源评论
收起资源包目录
_Book-Code(2).rar (96个子文件)
ACM国际大学生程序设计竞赛题解(2)
zju1100.cpp 790B
zju1105.c 612B
zju1103.c 2KB
zju1082.c 999B
zju1147.c 2KB
zju1126.c 996B
zju1159.c 1KB
zju1100.c 786B
zju1153.c 1KB
zju1098.cpp 1KB
zju1152.c 408B
Phylogenetic Trees Inherited.doc 26KB
zju1086.c 509B
Hike on a Graph.doc 24KB
zju1102.c 597B
zju1108.cpp 1KB
zju1151-string.cpp 402B
zju1149-DP.c 851B
zju1091.c 828B
zju1158.c 2KB
zju1107.c 1KB
zju1136.c 1KB
zju1129.cpp 2KB
zju1118.cpp 2KB
zju1101.c 932B
zju1119.cpp 2KB
zju1116.c 2KB
zju1097.c 1KB
zju1095.c 701B
zju1094-map-stack.cpp 861B
zju1104.c 864B
zju1111.c 2KB
zju1142.c 2KB
zju1094.c 918B
zju1143.c 609B
zju1142-Union.cpp 2KB
zju1149.c 810B
zju1123.c 2KB
zju1093-sort-DP.cpp 1KB
zju1132.c 2KB
zju1146.c 2KB
zju1117.c 1KB
zju1083.cpp 2KB
zju1091-knightMoves.xls 27KB
zju1160-01.c 474B
zju1090.c 482B
zju1133.c 738B
zju1114.c 1KB
zju1150.c 531B
zju1109-qsort.cpp 921B
zju1081.c 1KB
zju1099.c 604B
zju1084.cpp 1007B
zju1160.c 427B
zju1093-DP.c 1KB
zju1137.c 862B
ACM Problem B.files
fig1.gif 3KB
arrow.gif 132B
fig2.gif 4KB
fig3.gif 4KB
email.png 4KB
zju1115.c 255B
zju1156.c 2KB
zjc1151-sscanf.c 485B
zju1139.c 526B
zju1096.c 776B
zju1141.c 847B
zju1089.c 501B
zju1148.c 1KB
zju1088-math.c 295B
zju1112.c 1KB
zju1092.c 901B
zju1091-bfs.cpp 855B
zju1110.c 344B
zju1130.cpp 811B
Poker Hands.gif 64KB
zju1145.c 2KB
zju1097.cpp 983B
ACM Problem B.htm 4KB
zju1088.c 808B
zju1125.c 955B
zju1151.c 531B
zju1140.c 888B
zju1128.c 2KB
zju1109-map.cpp 520B
zju1134.c 915B
zju1127.c 1KB
zju1100-int64.c 793B
zju1085.cpp 1KB
zju1144.c 2KB
zju1120.c 410B
zju1091-dfs.c 602B
zju1122.c 670B
zju1121.cpp 2KB
zju1154.c 474B
zju1157.cpp 2KB
共 96 条
- 1
资源评论
- 姜楠的world2013-07-06内容不错,看上去程序代码简洁
- jerrykingwp2013-02-02内容不错,看上去程序代码简洁
- howlet_z2012-04-28内容与描述不符合,是第二册的不是第一册的。。。
loujun789
- 粉丝: 1
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功