首页 > 其他 > 详细

UVa 755 487-3279

时间:2014-03-23 23:00:06      阅读:521      评论:0      收藏:0      [点我收藏+]

思路:对每组数据把每个字符转换为相应的数字,并加入-,保存于一个字符串中。最后得到的是一个字符串数组,对该数据排序,相邻的判断即可~(排序后相邻判断这样的思路,前面做过好几个题了。)(此题对于我来说,主要是我对输入数据的理解有点紊乱,它是多组数据,而只有最后一组数据才遇到EOF,而且此题的最后一组数据的最后一行其实是有换行符的,而我竟然直接来一个while循环里判断EOF,明显错啊~可能做题时没专心,下次做题还是要专心,AC了后才干其他事吧~

注意:1.在用getchar()处理一行和到文件尾时有些模糊,最开始我写的好像是while的判断条件是!=EOF,而其实只有最后一组数据才会遇到EOF的。这样好像会导致RE错误。(遇到RE错误时,还以为是开了太大的数据,就把int cs[100010]给注释掉而用一个变量cnt来处理了。结果还是RE)上一题好像就也是这样错过,把while的条件前面加上了一个次数判断,当时没太注意,没有及时总结。或者可以用for循环判断次数、内部用while循环遇到‘\n‘的风格,而且从AC的代码来看,此题应该是都有‘\n‘(包括最后一行),不会直接就EOF。

2.转换的问题,用另一种方法可能更好。char convert[ 30 ] = "2223334445556667777888999"s[ p ][ j++ ] = convert[c-‘A‘]; 注意这里的convert数组是4个7,因为要忽略Q、Z,Z没影响。这是借鉴别人的方法,感觉思路很好,当时写if-else的时候就虽然可以复制、修改但还是感觉很麻烦,就在想有没有简洁的方法,果然~

另外在输出时,可以在qsort后多来一个字符串,即strcpy一个不会出现的字符串过去,在输出的时候就直接判断到<n-1就行了,循环后面不用再加。不过只要记着循环后要加最后一个数据也是一样的~

版本2是对上述几点修改后的代码~

另:RE可能是死循环一直等待读入(比如在while循环里用getchar判断结束时,如果你用的是!=‘\n‘,而输入的最后一行是eof而没有换行符,那么就会RE)

我这题的RE错误是,while循环里用!=EOF判断,而输入数据只有最后一组才遇到EOF,所以多于一组数据时,就出错,RE。。。

写得有点乱,有点啰嗦~

Code:

//#define LOCAL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100010

int cmp_str(const void *_a, const void *_b);

char dic[N][10];
//int cs[N];

int main()
{
 #ifdef LOCAL
  freopen("data755.in","r",stdin);
  freopen("data755.out","w",stdout);
 #endif   

 int num=0;
 scanf("%d",&num);
 while(num-->0)
 {
  int n=0;
  scanf("%d",&n);
  char c;
  int h=0,ln=0;
  getchar();//又忘了~ 
  //printf("n:%d\n",n);
  //while(x<n && (c=getchar())!=EOF)
  while(h<n)
  {
   c=getchar();
   if(c!=‘-‘&&c!=‘\n‘&&c!=EOF)
   {
    if(c==‘A‘||c==‘B‘||c==‘C‘) { dic[h][ln++]=‘2‘; if(ln==3) dic[h][ln++]=‘-‘;}
    else if(c==‘D‘||c==‘E‘||c==‘F‘) { dic[h][ln++]=‘3‘; if(ln==3) dic[h][ln++]=‘-‘;}
    else if(c==‘G‘||c==‘H‘||c==‘I‘) { dic[h][ln++]=‘4‘; if(ln==3) dic[h][ln++]=‘-‘;}  
    else if(c==‘J‘||c==‘K‘||c==‘L‘) { dic[h][ln++]=‘5‘; if(ln==3) dic[h][ln++]=‘-‘;}   
    else if(c==‘M‘||c==‘N‘||c==‘O‘) { dic[h][ln++]=‘6‘; if(ln==3) dic[h][ln++]=‘-‘;}      
    else if(c==‘P‘||c==‘R‘||c==‘S‘) { dic[h][ln++]=‘7‘; if(ln==3) dic[h][ln++]=‘-‘;}  
    else if(c==‘T‘||c==‘U‘||c==‘V‘) { dic[h][ln++]=‘8‘; if(ln==3) dic[h][ln++]=‘-‘;}
    else if(c==‘W‘||c==‘X‘||c==‘Y‘) { dic[h][ln++]=‘9‘; if(ln==3) dic[h][ln++]=‘-‘;}
    else { dic[h][ln++]=c; if(ln==3) dic[h][ln++]=‘-‘;}
   }
   else if(c==‘\n‘||c==EOF)
   {
    dic[h][ln]=‘\0‘;
    h++;ln=0;    
   }                        
  }//while
  
  qsort(dic,h,sizeof(dic[0]),cmp_str);             
  
  //for(int i=0;i<h;++i)
  // printf("%s\n",dic[i]);
  
  int cnt=1;
  bool flag=0; 
  for(int i=0;i<h-1;++i)
  {
   if(strcmp(dic[i],dic[i+1])==0) //{ cs[i+1]=cs[i+1]+cs[i]; cs[i]=0;}       
   { cnt++; flag=1;}
   else
   {
    if(cnt>1) printf("%s %d\n",dic[i],cnt);
    cnt=1;   
   }
  }
  if(cnt>1) printf("%s %d\n",dic[h-1],cnt);//不要忘了这个 
  if(flag==0) printf("No duplicates.\n");
  if(num) printf("\n");
 }  
 //system("pause");
 return 0;   
}

int cmp_str(const void *_a, const void *_b)
{
 char *a=(char*)_a;
 char *b=(char*)_b;
 return strcmp(a,b);   
}

版本2

//两个版本都可AC
//版本2 把之前想修改的地方修改了。 
//#define LOCAL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define N 100010

int cmp_str(const void *_a, const void *_b);

char dic[N][10];
char convert[]="2223334445556667777888999";

int main()
{
 #ifdef LOCAL
  freopen("data755.in","r",stdin);
  freopen("data755.out","w",stdout);
 #endif   

 int num=0;
 scanf("%d",&num);
 while(num-->0)
 {//一组数据 
  int n=0;
  scanf("%d",&n);
  char c;
  getchar();//又忘了~ 
  
  for(int h=0;h<n;++h)
  {//n个号码 
   int ln=0;
   while((c=getchar())!=‘\n‘)
   {//一行 
    if(isalpha(c))
    {
     dic[h][ln++]=convert[c-‘A‘];
     if(ln==3) dic[h][ln++]=‘-‘;             
    } 
    else if(c!=‘-‘)
    {
     dic[h][ln++]=c;
     if(ln==3) dic[h][ln++]=‘-‘;
    }
   }//while                     
   dic[h][ln]=‘\0‘;   
  }//for
  
  qsort(dic,n,sizeof(dic[0]),cmp_str);             
  strcpy(dic[n++],"X");
  
  int cnt=1;
  bool flag=0; 
  for(int i=0;i<n-1;++i)
  {
   if(strcmp(dic[i],dic[i+1])==0)     
   { cnt++; flag=1;}
   else
   {
    if(cnt>1) printf("%s %d\n",dic[i],cnt);
    cnt=1;   
   }
  }
  if(flag==0) printf("No duplicates.\n");
  if(num) printf("\n");
 }  
 //system("pause");
 return 0;   
}

int cmp_str(const void *_a, const void *_b)
{
 char *a=(char*)_a;
 char *b=(char*)_b;
 return strcmp(a,b);   
}



UVa 755 487-3279,布布扣,bubuko.com

UVa 755 487-3279

原文:http://blog.csdn.net/buxizhizhou530/article/details/21838737

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!