又是一篇血泪史.
这个题目和POJ1002是差不多的,先前已经做过一遍
大概半个小时后就完成了..
但是以为跟POJ上的一样,要处理Q和Z..就又折腾了一些时间.
折腾来折腾去不管怎么提交都是WA...推敲了好几遍我的思路,确认是没有问题的..于是就去睡觉了..
但是一道题目没解决..觉也睡不好.于是早上六点就醒了,又重新看了一遍程序.还是没有头绪,总感觉输出有问题..
于是又看了好几遍,才发现循环输出的时候多输出了一位
果然每次到数组就要死一次
思路就是把每个输入先存到buf数组里,再转化为数字存到二维数组里,用qsort排序,然后计数输出.
注意数组的临界.
PS:UVA这题根本不用考虑输入包括Q和Z时候的情况..而且题目里明明说了Excluding Q and Z.而POJ....╮(╯▽╰)╭
#include <string.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> int Search(char c); int comp(const void *_a, const void *_b) { char *a = (char *) _a; char *b = (char *) _b; return strcmp(a,b); } char word[110000][300]; char buf[300]; char str1[] = "ABCDEFGHIJKLMNOPRSTUVWXY"; char str2[] = "222333444555666777888999"; int main() { //freopen("input.txt", "r", stdin); int flag = 0; int i, j, T, n, k = 0, k1 = 0; int count = 1; scanf("%d", &T); while (T--) { count = 1; k1 = 0; flag = 0; memset(word, 0, sizeof(word)); scanf("%d", &n); getchar(); for (i = 0; i < n; i++) //依次读取字符串. { k = 0; memset(buf, 0, sizeof(buf)); gets(buf); for (j = 0; j < strlen(buf); j++) //把缓冲数组中的字符转化并存入正式数组 { if (buf[j] == '-') continue; else { if (isalpha(buf[j])) { int a = Search(buf[j]); //查找当前字母所代表的数字. word[i][k++] = str2[a]; } else word[i][k++] = buf[j]; } } } //读取完毕,下面进行排序. qsort(word, n, sizeof(word[0]), comp); for (i = 0; i < n - 1 ; i++) { if (!strcmp(word[i], word[i + 1])) { count++; } else { if (count > 1) { flag = 1; printf("%c%c%c-%c%c%c%c %d\n", word[i][0],word[i][1],word[i][2],word[i][3],word[i][4],word[i][5],word[i][6], count); count = 1; } } if (!strcmp(word[i], word[i + 1]) && i == n - 2) { if (count > 1) { flag = 1; printf("%c%c%c-%c%c%c%c %d\n", word[i][0],word[i][1],word[i][2],word[i][3],word[i][4],word[i][5],word[i][6], count); count = 1; } } } if (flag == 0) { printf("No duplicates.\n"); } if (T >= 1) printf("\n"); } } int Search(char c) { for (int i = 0; i < strlen(str1); i++) { if (str1[i] == c) return i; } }