📄 1041.cpp
字号:
/* This Code is Submitted by wywcgs for Problem 1041 on 2005-11-22 at 15:55:04 */
#include <cstdio>
#include <cstring>
const int L_MAX = 64;
const int S_MAX = 32;
class Sentence {
public:
char subject[L_MAX];
char verb[L_MAX];
char object[L_MAX];
bool neg;
};
void deal(char*);
char* change(char*);
int main()
{
int T, t, sn, i;
Sentence sent[S_MAX];
char line[L_MAX], word[L_MAX];
char subject[L_MAX], verb[L_MAX], object[L_MAX];
bool ill;
int stack[S_MAX], top;
scanf("%d", &T);
getchar();
for(t = 1; t <= T; t++) {
printf("Dialogue #%d:\n", t);
sn = 0;
ill = false;
while(gets(line) != NULL) {
int l = strlen(line);
char pun = line[l-1], *p = line;
line[l-1] = '\0';
if(pun == '!') {
printf("%s!\n\n", line);
break;
} else if(pun == '.') {
sscanf(p, "%s", sent[sn].subject);
p += strlen(sent[sn].subject) + 1;
sscanf(p, "%s", word);
p += strlen(word) + 1;
sent[sn].neg = false;
if(!strcmp(word, "don't") || !strcmp(word, "doesn't")) {
sent[sn].neg = true;
sscanf(p, "%s", word);
p += strlen(word) + 1;
} else if(!strcmp(sent[sn].subject, "nobody")) {
sent[sn].neg = true;
}
deal(word);
strcpy(sent[sn].verb, word);
strcpy(sent[sn].object, p);
if(!strcmp(sent[sn].subject, "everybody")) {
for(i = 0; i < sn; i++) {
if(!strcmp(sent[i].verb, sent[sn].verb)
&& !strcmp(sent[i].object, sent[sn].object) && sent[i].neg) {
ill = true;
break;
}
}
} else if(!strcmp(sent[sn].subject, "nobody")) {
for(i = 0; i < sn; i++) {
if(!strcmp(sent[i].verb, sent[sn].verb)
&& !strcmp(sent[i].object, sent[sn].object) && !sent[i].neg) {
ill = true;
break;
}
}
} else {
for(i = 0; i < sn; i++) {
if(!strcmp(sent[i].verb, sent[sn].verb)
&& !strcmp(sent[i].object, sent[sn].object)) {
if(!strcmp(sent[i].subject, sent[sn].subject) && (sent[i].neg != sent[sn].neg)) {
ill = true;
break;
} else if(!strcmp(sent[i].subject, "nobody") && !sent[sn].neg) {
ill = true;
break;
} else if(!strcmp(sent[i].subject, "everybody") && sent[sn].neg) {
ill = true;
break;
}
}
}
}
sn++;
} else {
printf("%s?\n", line);
sscanf(p, "%s", word);
p += strlen(word) + 1;
if(ill) {
printf("I am abroad.\n");
} else {
if(!strcmp(word, "who")) {
sscanf(p, "%s", verb);
p += strlen(verb) + 1;
strcpy(object, p);
deal(verb);
bool every = false, neg;
top = 0;
for(i = 0; i < sn; i++) {
if(!strcmp(sent[i].verb, verb)
&& !strcmp(sent[i].object, object)) {
if(!strcmp(sent[i].subject, "everybody")) {
every = true;
neg = false;
} else if(!strcmp(sent[i].subject, "nobody")) {
every = true;
neg = true;
} else if(!sent[i].neg) {
stack[top++] = i;
}
}
}
if(every) {
if(neg) {
printf("nobody");
} else {
printf("everybody");
}
printf(" %ss", verb);
if(object[0] != '\0') {
putchar(' ');
}
printf("%s.\n", object);
} else {
if(top == 0) {
printf("I don't know.\n");
} else {
for(i = 0; i < top; i++) {
if(i == 1 && top != 2) {
putchar(',');
} else if(i == top-1 && top != 1) {
printf(" and");
}
if(i != 0) {
putchar(' ');
}
printf("%s", change(sent[stack[i]].subject));
}
printf(" %s", verb);
if(top == 1 &&
strcmp(sent[stack[0]].subject, "I") &&
strcmp(sent[stack[0]].subject, "you")) {
putchar('s');
}
if(object[0] != '\0') {
putchar(' ');
}
printf("%s.\n", object);
}
}
} else if(!strcmp(word, "what")) {
sscanf(p, "%*s %s", subject);
bool haves;
if(!strcmp(subject, "you") || !strcmp(subject, "I")) {
haves = false;
} else {
haves = true;
}
top = 0;
for(i = 0; i < sn; i++) {
if(!strcmp(sent[i].subject, "everybody")
|| !strcmp(sent[i].subject, "nobody")
|| !strcmp(sent[i].subject, subject)) {
stack[top++] = i;
}
}
if(top == 0) {
printf("I don't know.\n");
} else {
printf("%s", change(subject));
for(i = 0; i < top; i++) {
if(i != 0) {
putchar(',');
}
if(i == top-1 && i != 0) {
printf(" and");
}
bool prints = haves;
if(sent[stack[i]].neg) {
if(haves) {
printf(" doesn't");
} else {
printf(" don't");
}
prints = false;
}
printf(" %s", sent[stack[i]].verb);
if(prints) {
putchar('s');
}
if(sent[stack[i]].object[0] != '\0') {
putchar(' ');
}
printf(sent[stack[i]].object);
}
printf(".\n");
}
} else {
sscanf(p, "%s", subject);
p += strlen(subject) + 1;
strcpy(subject, change(subject));
sscanf(p, "%s", verb);
p += strlen(verb) + 1;
deal(verb);
strcpy(object, p);
bool haves;
if(!strcmp(subject, "you") || !strcmp(subject, "I")) {
haves = false;
} else {
haves = true;
}
bool find = false;
for(i = 0; i < sn; i++) {
if(!strcmp(verb, sent[i].verb) &&
!strcmp(object, sent[i].object)) {
if(!strcmp(subject, sent[i].subject)
|| !strcmp(sent[i].subject, "everybody")
|| !strcmp(sent[i].subject, "nobody")) {
find = true;
if(sent[i].neg) {
printf("no, %s", subject);
if(haves) {
printf(" doesn't");
} else {
printf(" don't");
}
printf(" %s", verb);
if(object[0] != 0) {
putchar(' ');
}
printf("%s.\n", object);
} else {
printf("yes, %s %s", subject, verb);
if(haves) {
putchar('s');
}
if(object[0] != 0) {
putchar(' ');
}
printf("%s.\n", object);
}
break;
}
}
}
if(!find) {
printf("maybe.\n");
}
}
}
putchar('\n');
}
}
}
return 0;
}
void deal(char *s)
{
int l = strlen(s);
if(s[l-1] == 's') {
s[l-1] = '\0';
}
}
char* change(char *s) {
if(!strcmp(s, "I")) {
return "you";
} else if(!strcmp(s, "you")) {
return "I";
} else {
return s;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -