zrq495
www.zrq495.com

题意很好理解,从八个方向查找字符串。真麻烦。。。不过1A 。^_^

在输入的时候把大写字母全都转换 成小写字母,这样省事。

在判断的时候我下面的8次代码判断,其实向左和向右用一个函数就可以判断,写四个函数就可以了。。。

代码有点长。。。

如下:

 

  1 #include<stdio.h>
  2 #include<string.h>
  3 
  4 int m, n;
  5 char str[55][55], s[55];
  6 
  7 void strlwr(char str[])                //大写字母变小写字母
  8 {
  9     int i=0;
 10     while(str[i] != '\0')
 11     {
 12         if (str[i] >= 'A' && str[i] <= 'Z')
 13         {
 14             str[i]+=32;
 15         }
 16         i++;
 17     }
 18 }
 19 
 20 void search()
 21 {
 22     int i, j, k, len;
 23     len=strlen(s);
 24     for (i=0; i<n; i++)
 25     {
 26         for (j=0; j<m; j++)
 27         {
 28             if (str[i][j] == s[0])
 29             {
 30                 if (len == 1)            //只有一个字符,直接输出
 31                 {
 32                     printf("%d %d\n", i+1, j+1);
 33                     return ;
 34                 }
 35                 if (str[i][j+1] == s[1])        //向右查找
 36                 {
 37                     if (len == 2)            //只有两个字符,输出
 38                     {
 39                         printf("%d %d\n", i+1, j+1);
 40                         return ;
 41                     }
 42                     for (k=2; k<len; k++)        
 43                     {
 44                         if (s[k] != str[i][j+k] || (j+k)>=m)
 45                         {
 46                             break;
 47                         }
 48                     }
 49                     if (k == len)
 50                     {
 51                         printf("%d %d\n", i+1, j+1);
 52                         return ;
 53                     }
 54                 }
 55                 if (str[i][j-1] == s[1])        //向左查找
 56                 {
 57                     if (len == 2)
 58                     {
 59                         printf("%d %d\n", i+1, j+1);
 60                         return ;
 61                     }
 62                     for (k=2; k<len; k++)
 63                     {
 64                         if (s[k] != str[i][j-k] || (j-k) <0)
 65                         {
 66                             break;
 67                         }
 68                     }
 69                     if (k == len)
 70                     {
 71                         printf("%d %d\n", i+1, j+1);
 72                         return ;
 73                     }
 74                 }
 75                 if (str[i+1][j] == s[1])        //向下查找
 76                 {
 77                     if (len == 2)
 78                     {
 79                         printf("%d %d\n", i+1, j+1);
 80                         return ;
 81                     }
 82                     for (k=2; k<len; k++)
 83                     {
 84                         if (s[k] != str[i+k][j] || (i+k)>=n)
 85                         {
 86                             break;
 87                         }
 88                     }
 89                     if (k == len)
 90                     {
 91                         printf("%d %d\n", i+1, j+1);
 92                         return ;
 93                     }
 94                 }
 95                 if (str[i-1][j] == s[1])        //向上查找
 96                 {
 97                     if (len == 2)
 98                     {
 99                         printf("%d %d\n", i+1, j+1);
100                         return ;
101                     }
102                     for (k=2; k<len; k++)
103                     {
104                         if (s[k] != str[i-k][j] || (i-k) <0)
105                         {
106                             break;
107                         }
108                     }
109                     if (k == len)
110                     {
111                         printf("%d %d\n", i+1, j+1);
112                         return ;
113                     }
114                 }
115                 if (str[i-1][j-1] == s[1])        //向左上查找
116                 {
117                     if (len == 2)
118                     {
119                         printf("%d %d\n", i+1, j+1);
120                         return ;
121                     }
122                     for (k=2; k<len; k++)
123                     {
124                         if (s[k] != str[i-k][j-k] || (j-k) <0 || (i-k)<0)
125                         {
126                             break;
127                         }
128                     }
129                     if (k == len)
130                     {
131                         printf("%d %d\n", i+1, j+1);
132                         return ;
133                     }
134                 }
135                 if (str[i+1][j-1] == s[1])        //向左下查找
136                 {
137                     if (len == 2)
138                     {
139                         printf("%d %d\n", i+1, j+1);
140                         return ;
141                     }
142                     for (k=2; k<len; k++)
143                     {
144                         if (s[k] != str[i+k][j-k] || (j-k) <0 || (i+k)>=n)
145                         {
146                             break;
147                         }
148                     }
149                     if (k == len)
150                     {
151                         printf("%d %d\n", i+1, j+1);
152                         return ;
153                     }
154                 }
155                 if (str[i-1][j+1] == s[1])        //向右上查找
156                 {
157                     if (len == 2)
158                     {
159                         printf("%d %d\n", i+1, j+1);
160                         return ;
161                     }
162                     for (k=2; k<len; k++)
163                     {
164                         if (s[k] != str[i][j-k] || (j+k)>=m || (i-k)<0)
165                         {
166                             break;
167                         }
168                     }
169                     if (k == len)
170                     {
171                         printf("%d %d\n", i+1, j+1);
172                         return ;
173                     }
174                 }
175                 if (str[i+1][j+1] == s[1])        //向右下查找
176                 {
177                     if (len == 2)
178                     {
179                         printf("%d %d\n", i+1, j+1);
180                         return ;
181                     }
182                     for (k=2; k<len; k++)
183                     {
184                         if (s[k] != str[i+k][j+k] || (j+k)>=m || (i+k)>=n)
185                         {
186                             break;
187                         }
188                     }
189                     if (k == len)
190                     {
191                         printf("%d %d\n", i+1, j+1);
192                         return ;
193                     }
194                 }
195             }
196         }
197     }
198 }
199 
200 int main()
201 {
202     int i, T, x;
203     scanf("%d%*c%*c", &T);
204     while(T--)
205     {
206         scanf("%d%d%*c", &n, &m);
207         for (i=0; i<n; i++)
208         {
209             gets(str[i]);
210             strlwr(str[i]);
211         }
212         scanf("%d%*c", &x);
213         for (i=0; i<x; i++)
214         {
215             gets(s);
216             strlwr(s);
217             search();
218         }
219         if (T)
220             printf("\n");
221     }
222     return 0;
223 }
posted on 2012-05-25 20:16  zrq495  阅读(259)  评论(0编辑  收藏  举报