题意很好理解,从八个方向查找字符串。真麻烦。。。不过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 }