-
题设
假设服务器aM依赖于服务器aN, 用aM-aN表示, 并且这种依赖关系可以传递, 服务器总数量小于3000. 现有一些列的服务器依赖关系和损坏的服务器, 编程升序输出所有可以正常工作的服务器, 输入输出格式严格按照下面是示例, 输入依赖aM-aN间以逗号分隔,第二行为损坏的服务器,也以逗号分隔, 第三行输出正常的服务器, 以逗号分隔.输入示例:
a1-a2,a3-a4,a5-a1,a4-a6
a2
输出
a3,a4,a6
-
纯c求解
/* * @author: garret * @date: 2020/07/15 * @comipler: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 */ #include <stdio.h> #include <string.h> #include <assert.h> #define MAX_SV 3000 struct dep_sv { char srv[6]; char match[6]; }; int get_num(char *str) { int i = 0; while ('-' != (str[i])) { i ++; } return i; } /* * @author: garret * @dsp: use rescursion to find dependences. */ int is_brk(char (*brk)[6], struct dep_sv *deps, int total_brk, int total_dep, char *sv) { int i = 0, j = 0, k = 0; for (i = 0; i < total_brk; i++) { if (!strcmp(*(brk+i), sv)) { return 1; } } for (i = 0; i < total_dep; i++) { //printf("%s(%d)\n", __func__, __LINE__); for (j = 0; j < total_brk; j++) { //printf("(%d): srv = %s, brk+j str = %s, sv = %s\n",__LINE__, (deps+i)->srv, *(brk+j), sv); if (!strcmp((deps+i)->srv, sv)) { if (!strcmp((deps+i)->match, *(brk+j))) { //printf("%s(%d)\n", __func__, __LINE__); return 1; } else { for (k = 0; k < total_brk; k++) { //printf("(%d) srv = %s, (deps+i)->match) = %s\n", __LINE__, (deps+k)->srv, (deps+i)->match); if (!strcmp((deps+k)->srv, (deps+i)->match)) { if (!strcmp((deps+k)->match, *(brk+j))) { return 1; } else { //printf("%s(%d)\n", __func__, __LINE__); is_brk(brk, deps, total_brk, total_dep, (deps+k)->match); } } } } } } } return 0; } int bubble_sort(char (*str)[6], int num) { int i, j; char tmp[6]; for (i = 0; i < num-1; i++) { for (j = 0; j < num-1-i; j++) { //printf("%s(%d) i=%d j=%d num = %d \n", __func__, __LINE__, i,j, num); if ((strlen(*(str+j)) > strlen(*(str+j+1))) || \ ((strlen(*(str+j)) == strlen(*(str+j+1))) && strncmp(*(str+j), *(str+j+1), 6) > 0)) { //printf("%s(%d)\n", __func__, __LINE__); strncpy(tmp, *(str+j), 6); strncpy(*(str+j), *(str+j+1), 6); strncpy(*(str+j+1), tmp, 6); } } } return 0; } int is_exsited(char (*str)[6], char *srv, int num) { int i; for (i = 0; i < num + 1; i++) { if (!strncmp(*(str+i), srv, 6)) { return 1; } } return 0; } int main() { char dep_str[MAX_SV*14]; char delm[2] = ","; char orig_deps[MAX_SV/2][14]; struct dep_sv deps[MAX_SV/2]; char brk_str[MAX_SV*14]; char brk_sv[MAX_SV][6]; //fgets(dep_str, MAX_SV*14-1, stdin); scanf("%s", dep_str); int i = 0; int j = 0; char *str1 = strtok(dep_str, delm); while (str1 != NULL) { j = get_num(str1); //printf("%d\n", j); snprintf(deps[i].srv, j+1, "%s", str1); snprintf(deps[i].match, 6, "%s", str1+j+1); //printf("%s %s\n", deps[i].srv, deps[i].match); assert(strlen(deps[i].srv) > 1); assert(strlen(deps[i].match) > 1); str1 = strtok(NULL, delm); i ++; } int total_dep = i; i = 0; scanf("%s", brk_str); char *str2 = strtok(brk_str, delm); while (str2 != NULL) { assert(strlen(str2) > 1); strncpy(brk_sv[i], str2, 6); //printf("%s\n", brk_sv[i]); str2 = strtok(NULL, delm); i ++; } int total_brk = i; //printf("%d\n", total_brk); char normal_srv[MAX_SV][6] = {'\0'}; int total_normal = 0; //printf("total_dep = %d, total_brk = %d\n", total_dep, total_brk); for (i = 0; i < total_dep; i++) { if (!is_brk(brk_sv, deps, total_brk, total_dep, (deps+i)->srv)) { if (!is_exsited(normal_srv, (deps+i)->srv, total_normal)) { //printf("%s(%d)\n", __func__, __LINE__); strncpy(normal_srv[total_normal], (deps+i)->srv, 6); total_normal ++; } } if (!is_brk(brk_sv, deps, total_brk, total_dep, (deps+i)->match)) { if (!is_exsited(normal_srv, (deps+i)->match, total_normal)) { //printf("%s(%d)\n", __func__, __LINE__); strcpy(normal_srv[total_normal], (deps+i)->match); total_normal++; } } } //printf("%d\n", total_normal); bubble_sort(normal_srv, total_normal); for (i = 0; i < total_normal; i++) { if (i != total_normal-1) { printf("%s,", normal_srv[i]); } else { printf("%s\n", normal_srv[i]); } } return 0; }
测试用例:
一:
a2-a1,a2-a3,a1-a2
a2
二:
a1-a2,a5-a3,a1-a4,a6-a7,a9-a2,a5,a8-a3
a3,a4
三:
a2-a1,a2-a3,a5-a100,a2399-a3,a450-a2,a3-a4,a500-a3,a1999-a222
a2,a5,a3