简单的八方向搜索,暴力即可
代码:
#include<cstdio> #include<cstring> #include<ctype.h> #include<iostream> using namespace std; #define bug(s) cout<<#s<<"="<<s #define stop {getchar();getchar();} #define MAXN 52 #define MAXK 22 char a[MAXN][MAXN]; char words[MAXK][MAXN]; int n, m; int k; const int dx[] = { -1, 1, 0, 0, 1, -1, 1, -1 }; const int dy[] = { 0, 0, 1, -1, 1, -1, -1, 1}; int walk(int dir, int x, int y, int cur, char wd[], int num) { if(cur == num) return 1; if(x<0 || x>=n) return 0; if(y<0 || y>=m) return 0; if(tolower(wd[cur]) == a[y][x]) { return walk(dir, x+dx[dir], y+dy[dir], cur+1, wd, num); } else return 0; } void solve(int idx) //idx in k words to search { for(int i=0; i<m; i++) for(int j=0; j<n; j++) { for(int d=0; d<8; d++) { if(walk(d, j, i, 0, words[idx], strlen(words[idx]))) { printf("%d %d\n", i+1, j+1); return; //return写成break,wa一次。。 } } } } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &m, &n); for(int i=0; i<m; i++) //m lines { scanf("%s", a[i]); for(int j=0; j<n; j++) a[i][j] = tolower(a[i][j]); } scanf("%d", &k); for(int i=0; i<k; i++) { scanf("%s", words[i]); } for(int i=0; i<k; i++) { solve(i); } if(t) printf("\n");//The outputs of two consecutive cases will be separated by a blank line. } }