题意:给出一个m x n的字符矩阵,给出k个字符串,求这个字符串的起始位置在图中坐标(方向要直,但可上、下、左、右、左上、左下、右上、右下8个方向, 1 <= m, n <= 50, 1 <= k <= 20)。
——>>暴力枚举复杂度为O(mnk*len(s)),这是可以接受的。
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
const int maxn = 50 + 10;
char G[maxn][maxn];
int m, n;
int dx[] = {-1, -1, -1, 0, 1, 1, 1, 0};
int dy[] = {-1, 0, 1, 1, 1, 0, -1, -1};
bool is_ok(int x, int y, string s) //判断(x, y)是否满足条件
{
int i, j, xx, yy;
bool ok;
for(i = 0; i < 8; i++)
{
ok = 1;
int len = s.length();
for(xx = x, yy = y, j = 0; j < len; xx += dx[i], yy += dy[i], j++)
{
if(xx < 1 || xx > m || yy < 1 || yy > n)
{
ok = 0;
break;
}
if(G[xx][yy] != s[j])
{
ok = 0;
break;
}
}
if(ok) return 1;
}
return 0;
}
int main()
{
int T, k, i, j;
string s;
cin>>T;
while(T--)
{
cin>>m>>n;
for(i = 1; i <= m; i++)
for(j = 1; j <= n; j++)
{
cin>>G[i][j];
G[i][j] = tolower(G[i][j]);
}
cin>>k;
while(k--)
{
cin>>s;
int len = s.length();
for(i = 0; i < len; i++) s[i] = tolower(s[i]);
bool ok = 0;
for(i = 1; i <= m; i++)
{
for(j = 1; j <= n; j++)
{
if(is_ok(i, j, s))
{
ok = 1;
break;
}
}
if(ok) break;
}
cout<<i<<" "<<j<<endl;
}
if(T) cout<<endl;
}
return 0;
}