题目:10010 - Where's Waldorf?
题目大意:在给定的二维字符数组中找给定的字符串的起始位置,寻找方式可以有八个方向(即八个方向都有可能会出现给定的字符串),如果有多个起始位置,选最靠左,靠上的位置;
解题思路:定义一个方位数组用来表示八个方向move【8】【2】,然后在二维字符数组中找到与给定字符串的头个字符相同的位置,然后从这里开始八个方向的寻找是否有这个字符串在字符数组里,有的话则返回头个字符的位置,没有就继续找;要注意每个case输出后都要输出回车,还有可以将字符数组和字符串转换成都大写字母或都小写字母,方便比较;
#include<stdio.h> #include<string.h> int move[8][2]={{-1,0},{1,0},{0,-1},{0,1},{1,-1},{1,1},{-1,1},{-1,-1}}; char arrary[55][55]; char s[2]; char a[55]; bool judge( char *a, int n, int m) { int number=strlen(a); int i, j, l, h, g, k; for (i = 0; i<n ;i++) for(j = 0;j<m; j++) { if(arrary[i][j]==a[0]) { k = i; l = j; for(h = 0; h<8; h++) { for(g = 0; g<number; g++, i += move[h][0], j += move[h][1]) { if((i>=0 && i<n) && (j>=0 && j<m)) { if(a[g] != arrary[i][j]) break; } else break; } if(g==number) { s[0] = k+1; s[1] = l+1; return true; } else { i = k; j = l; } } } } return false; } void change(char * s) { int len = strlen(s); int i; for (i = 0; i<len; i++) if(s[i] >= 'a'&&s[i] <= 'z') s[i]-=32; } int main() { int numcase, i, m, n, l, j; scanf("%d", &numcase); memset(arrary, 0, sizeof(arrary)); memset(a, 0, sizeof(a)); for (i = 0; i < numcase; i++) { scanf("%d %d", &n, &m); for(j = 0; j <n; j++) scanf("%s", arrary[j]); for(j = 0; j<n; j++) change(arrary[j]); int num; scanf("%d", &num); for (j = 0; j < num; j++) { scanf("%s", a); change(a); if(judge(a, n, m)) printf("%d %d\n",s[0], s[1]); memset(a, 0, sizeof(a)); } if(i!=numcase-1) printf("\n"); } return 0; }