#include <stdio.h>
#include <string.h>
struct pos
{
int x;
int y;
};
pos result;
int times;
int m,n;
int wdNum;
char word[30][60];
char txt[60][60];
bool findWord(char *str,int len,int findOri)
{
int i,j,k;
if(1==findOri)//横向->
{
for(i=0;i<m;i++)//矩阵中m个单词
{
for(j=0;j<n-len+1;j++)//n 为矩阵中单词的长度
{
for(k=0;k<len;k++)
{
if(str[k]==txt[i][j+k])
continue;
else
break;
}
if(k==len)
{
result.x=1+j;
result.y=1+i;
return true;
}
}
}
}
if(2==findOri)//横向<-
{
for(i=0;i<m;i++)//矩阵中m个单词
{
for(j=n-1;j>=len-1;j--)//n 为矩阵中单词的长度,j小于待比对的单词长度就不用再查了,肯定不能匹配上了
{
for(k=0;k<len;k++)
{
if(str[k]==txt[i][j-k])
continue;
else
break;
}
if(k==len)
{
result.x=1+j;
result.y=1+i;
return true;
}
}
}
}
if(3==findOri)//向下,即先纵向搜索,再横向搜索
{
for(i=0;i<n;i++)//n为矩阵中单词的长度
{
for(j=0;j<m-len+1;j++)
{
for(k=0;k<len;k++)
{
if(str[k]==txt[j+k][i])
continue;
else
break;
}
if(k==len)
{
result.x=1+i;
result.y=1+j;
return true;
}
}
}
}
if(4==findOri)//向上,即先纵向搜索,再横向搜索
{
for(i=0;i<n;i++)//n为矩阵中单词的长度
{
for(j=m-1;j>=len-1;j--)
{
for(k=0;k<len;k++)
{
if(str[k]==txt[j-k][i])
continue;
else
break;
}
if(k==len)
{
result.x=1+i;
result.y=1+j;
return true;
}
}
}
}
if(5==findOri)//右上
{
for(i=len-1;i<m;i++)//从第len-1行开始向右上方递增
{
for(j=0;j<n-len+1;j++)//到第n-len+1列
{
for(k=0;k<len;k++)
{
if(str[k]==txt[i-k][j+k])
continue;
else
break;
}
if(k==len)
{
result.x=(j+(k-1))+2-len;
result.y=(i-(k-1))+len;
return true;
}
}
}
}
if(6==findOri)//右下
{
for(i=0;i<m-len+1;i++)//从第0行开始向右下方递增
{
for(j=0;j<n-len+1;j++)//到第n-len+1列
{
for(k=0;k<len;k++)
{
if(str[k]==txt[i+k][j+k])
continue;
else
break;
}
if(k==len)
{
result.x=(j+(k-1))-len+2;
result.y=(i+(k-1))-len+2;
return true;
}
}
}
}
if(7==findOri)//左上
{
for(i=len-1;i<m;i++)//从第len-1行开始向右上方递增
{
for(j=len-1;j<n;j++)//到第n-len+1列
{
for(k=0;k<len;k++)
{
if(str[k]==txt[i-k][j-k])
continue;
else
break;
}
if(k==len)
{
result.x=(j-(k-1))+len;
result.y=(i-(k-1))+len;
return true;
}
}
}
}
if(8==findOri)//左下
{
for(i=0;i<m-len+1;i++)//从第len-1行开始向右上方递增
{
for(j=len-1;j<n;j++)//到第n-len+1列
{
for(k=0;k<len;k++)
{
if(str[k]==txt[i+k][j-k])
continue;
else
break;
}
if(k==len)
{
result.x=(j-(k-1))+len;
result.y=(i+(k-1))-len+2;
return true;
}
}
}
}
return false;
}
int main()
{
int i,j;
scanf("%d",×);
printf("\n");
while(times--)
{
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
scanf("%s",txt[i]);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
if('A'<=txt[i][j] && txt[i][j]<='Z')
txt[i][j]=txt[i][j]+32;
}
scanf("%d",&wdNum);
for(i=0;i<wdNum;i++)
scanf("%s",word[i]);
for(i=0;i<wdNum;i++)
{
j=0;
while(word[i][j]!='\0')
{
if('A'<=word[i][j] && word[i][j]<='Z')
word[i][j]=word[i][j]+32;
j++;
}
}
for(i=0;i<wdNum;i++)
{
if(findWord(word[i],strlen(word[i]),1))//横向->
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),2))//横向<-
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),3))//向下
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),4))//向上
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),5))//右上
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),6))//右下
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),7))//左上
{
printf("%d %d\n",result.y,result.x);
continue;
}
if(findWord(word[i],strlen(word[i]),8))//左下
{
printf("%d %d\n",result.y,result.x);
continue;
}
}
if((times-1)!=0)//最后一个回车不输出吧...
printf("\n");
}
return 0;
}