当前位置:编程学习 > C/C++ >>

UVa oj AOAPC Volume 1. Elementary Problem Solving String

好好做题,天天AC,又用了几天时间,把 Volume 1的字符串给做完了,还是像以前一样,把每一道题都回顾一下,以便自己的回顾和提高,同时也方便大家互相交流。。。。。
字符串的题都不算难,一般自己就可以看出做得对不对,下面是我做的那9道水题……

第一题:401 - Palindromes
大致题意:给你个字符串,判断是不是镜像和回文。
题目分析:回文不难,一个头,一个尾,往中间扫就好了……镜像的话,题目中有定义(什么2和S,3和E啦……),我开了个数组来处理的,不知道有没有更好的方法……欢迎指教
代码: 1 #include <stdio.h> 2 #include <stdlib.h>
 3 #include <string.h>
 4 const int maxlen=50;
 5 char a[maxlen],jingxiang[maxlen];
 6 int lena;
 7 bool ishuiwen ()
 8 {
 9     int i,j;
10     for (i=0,j=lena-1;i<j;i++,j--){
11         if (a[j]!=a[i])   return false;
12     }
13     return true;
14 }
15 bool isjingxiang ()
16 {
17     int i,j;
18     for (i=0,j=lena-1;i<=j;i++,j--){
19         if (a[i]<='9' && '1'<=a[i])
20         {
21             if (a[j] != jingxiang[a[i]-'1'+26])
22             {   return false;   }
23         }
24         else
25         {
26             if (a[j] != jingxiang[a[i]-'A'])
27             {   return false;   }
28         }
29     }
30     return true;
31 }
32 void csh ()
33 {
34     memset(jingxiang,0,sizeof(jingxiang));
35     jingxiang[0]='A';jingxiang[4]='3';jingxiang[7]='H';jingxiang[8]='I';
36     jingxiang[9]='L';jingxiang[11]='J';jingxiang[12]='M';jingxiang[14]='O';
37     jingxiang[18]='2';jingxiang[19]='T';jingxiang[20]='U';jingxiang[21]='V';
38     jingxiang[22]='W';jingxiang[23]='X';jingxiang[24]='Y';jingxiang[25]='5';
39     jingxiang[26]='1';jingxiang[27]='S';jingxiang[28]='E';jingxiang[30]='Z';jingxiang[33]='8';
40 }
41 int main()
42 {
43     int i;
44     while (gets(a)){
45         lena=strlen(a);
46         csh();
47         if (ishuiwen() && isjingxiang())
48             printf("%s -- is a mirrored palindrome.\n\n",a);
49         else if (ishuiwen())
50             printf("%s -- is a regular palindrome.\n\n",a);
51         else if (isjingxiang())
52             printf("%s -- is a mirrored string.\n\n",a);
53         else printf("%s -- is not a palindrome.\n\n",a);
54     }
55     return 0;
56 }心得体会:自己想出来用一个数组来做查询表,不知道是不是好的方法,希望大家给点建议;还有,判断是否镜像时,中间那个也要判断,我一开始中间那个没判断,WA了好几次……

 

 


第二题:10010 - Where's Waldorf?
大致题意:在一个字符串矩阵里找一个字符串,允许横,竖,斜着查找……
题目分析:我编了8个字符串匹配函数……囧o(╯□╰)o,一个一个找出来的。。。。。。有没有好方法啊???跪求……
代码:
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>     //不是格式问题?!!!!!
  4 const int maxlen=100;
  5 char a[maxlen][maxlen],b[maxlen];
  6 int T,m,n,lenb;
  7 bool f1 (int i,int j)
  8 {   int k=0;
  9     if (n-j<lenb)   return false;
 10     for (;k<lenb;k++,j++){
 11         if ( a[i][j] != b[k] )   return false;
 12     }
 13     return true;
 14 }
 15 bool f2 (int i,int j)
 16 {   int k=0,flage;
 17     flage= (i+1)<(n-j) ? (i+1):(n-j);
 18     if (flage<lenb)   return false;
 19     for (;k<lenb;i--,j++,k++){
 20         if ( a[i][j] != b[k] )   return false;
 21     }
 22     return true;
 23 }
 24 bool f3 (int i,int j)
 25 {   int k=0;
 26     if (i+1<lenb)   return false;
 27     for (;k<lenb;i--,k++){
 28         if ( a[i][j] != b[k] )   return false;
 29     }
 30     return true;        
 31 }
 32 bool f4 (int i,int j)
 33 {   int k=0,flage;
 34     flage=(i+1)<(j+1) ? (i+1):(j+1);
 35     if (flage<lenb)   return false;
 36     for (;k<lenb;i--,j--,k++){
 37         if ( a[i][j] != b[k] )   return false;
 38     }
 39     return true;
 40 }
 41 bool f5 (int i,int j)
 42 {   int k=0;
 43     if (j+1<lenb)   return false;
 44     for (;k<lenb;j--,k++){
 45         if ( a[i][j] != b[k])  return false;
 46     }      
 47     return true;     
 48 }
 49 bool f6 (int i,int j)        
 50 {    int k=0,flage;
 51      flage=(m-i)<(j+1)?(m-i):(j+1);
 52      if (flage<lenb)   return false;
 53      for (;k<lenb;i++,j--,k+

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,