#include <iostream>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
using namespace std;
#define maxnsize 55
int n,m;
char gird[maxnsize][maxnsize];
int ansx, ansy;
bool check(char *s)
{
int i,j,k,l;
int len = strlen(s);
int cnt = 0;
ansx = 0;
ansy = 0;
for( i = 0; i < n; i++)
{
for( j = 0; j< m; j++)
{
if(gird[i][j] == s[0])
{
ansx = i + 1;
ansy = j + 1;
cnt = 0;
if(m - j >= len)//same row ->
{
for( k = j, cnt = 0; k < j + len; k++)
{if(s[cnt] != gird[i][k])
break;
cnt++;
}
if(cnt == len)
return true;
}
if( j + 1 >= len)//same row <-
{
for( k = j,cnt = 0; k >= j + 1 - len; k--)
{
{if(s[cnt] != gird[i][k])
break;
cnt++;
}
}
if(cnt == len)
return true;
}
if( n - i >= len)//same c
{
for( k = i, cnt = 0; k < i + len; k++)
{
{if(s[cnt] != gird[k][j])
break;
cnt++;
}
}
if(cnt == len)
return true;
}
if( i + 1 >= len)//same c
{
for( k = i,cnt = 0; k >= i + 1 - len; k--)
{
{if(s[cnt] != gird[k][j])
break;
cnt++;
}
}
if(cnt == len)
return true;
}
if(n - i >= len && m - j >= len)
{
l = i, k = j;
for( cnt = 0; cnt < len; cnt++)
{
{if(s[cnt] != gird[l][k])
break;
l++,k++;
}
}
if(cnt == len)
return true;
}
if(i + 1 >= len && j + 1 >= len)
{
for( k = j,l = i, cnt = 0; cnt <len ; k--, l--)
{
if(s[cnt] != gird[l][k])
break;
cnt++;
}
if(cnt == len)
return true;
}
if(n - i >= len && j + 1 >= len)
{
l = i, k = j;
for( cnt = 0; cnt < len; cnt++)
{
if(s[cnt] != gird[l][k])
break;
l++,k--;
}
if(cnt == len)
return true;
}
if(i + 1 >= len && m - j>= len)
{
l = i, k = j;
for( cnt = 0; cnt < len; cnt++)
{
if(s[cnt] != gird[l][k])
break;
l--;
k++;
}
if(cnt == len)
return true;
}
}
}
}
return false;
}
int main()
{
int t, q;
char que[maxnsize];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n, &m);
for( int i = 0; i<n; i++)
scanf("%s",gird[i]);
for( int i = 0; i<n; i++)
for( int j = 0; j<m; j++)
gird[i][j] = tolower(gird[i][j]);
scanf("%d",&q);
while(q--)
{
scanf("%s",que);
for( int i = 0; que[i] != '\0'; i++)
que[i] = tolower(que[i]);
if(check(que))
{
printf("%d %d\n",ansx, ansy);
}
}
if(t)
printf("\n");
}
return 0;
}
#include <string.h>
#include <stdio.h>
#include <ctype.h>
using namespace std;
#define maxnsize 55
int n,m;
char gird[maxnsize][maxnsize];
int ansx, ansy;
bool check(char *s)
{
int i,j,k,l;
int len = strlen(s);
int cnt = 0;
ansx = 0;
ansy = 0;
for( i = 0; i < n; i++)
{
for( j = 0; j< m; j++)
{
if(gird[i][j] == s[0])
{
ansx = i + 1;
ansy = j + 1;
cnt = 0;
if(m - j >= len)//same row ->
{
for( k = j, cnt = 0; k < j + len; k++)
{if(s[cnt] != gird[i][k])
break;
cnt++;
}
if(cnt == len)
return true;
}
if( j + 1 >= len)//same row <-
{
for( k = j,cnt = 0; k >= j + 1 - len; k--)
{
{if(s[cnt] != gird[i][k])
break;
cnt++;
}
}
if(cnt == len)
return true;
}
if( n - i >= len)//same c
{
for( k = i, cnt = 0; k < i + len; k++)
{
{if(s[cnt] != gird[k][j])
break;
cnt++;
}
}
if(cnt == len)
return true;
}
if( i + 1 >= len)//same c
{
for( k = i,cnt = 0; k >= i + 1 - len; k--)
{
{if(s[cnt] != gird[k][j])
break;
cnt++;
}
}
if(cnt == len)
return true;
}
if(n - i >= len && m - j >= len)
{
l = i, k = j;
for( cnt = 0; cnt < len; cnt++)
{
{if(s[cnt] != gird[l][k])
break;
l++,k++;
}
}
if(cnt == len)
return true;
}
if(i + 1 >= len && j + 1 >= len)
{
for( k = j,l = i, cnt = 0; cnt <len ; k--, l--)
{
if(s[cnt] != gird[l][k])
break;
cnt++;
}
if(cnt == len)
return true;
}
if(n - i >= len && j + 1 >= len)
{
l = i, k = j;
for( cnt = 0; cnt < len; cnt++)
{
if(s[cnt] != gird[l][k])
break;
l++,k--;
}
if(cnt == len)
return true;
}
if(i + 1 >= len && m - j>= len)
{
l = i, k = j;
for( cnt = 0; cnt < len; cnt++)
{
if(s[cnt] != gird[l][k])
break;
l--;
k++;
}
if(cnt == len)
return true;
}
}
}
}
return false;
}
int main()
{
int t, q;
char que[maxnsize];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n, &m);
for( int i = 0; i<n; i++)
scanf("%s",gird[i]);
for( int i = 0; i<n; i++)
for( int j = 0; j<m; j++)
gird[i][j] = tolower(gird[i][j]);
scanf("%d",&q);
while(q--)
{
scanf("%s",que);
for( int i = 0; que[i] != '\0'; i++)
que[i] = tolower(que[i]);
if(check(que))
{
printf("%d %d\n",ansx, ansy);
}
}
if(t)
printf("\n");
}
return 0;
}