⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1041.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 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 + -