close
/*
2020/1/13
解題思路
用雙迴圈在文字塊中一字一字與查詢的字的第一個字進行比對
當文字塊的字與查詢的字的第一個字一樣就開始檢查8個方向
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
int case_number,n,m,k;
int now=0,f=0;
cin>>case_number;//輸入測資數量
while(case_number--)
{
if(f==1)//每筆測資要空一行
{
cout<<endl;
}
cin>>m>>n;//輸入文字塊大小
string str1[m];//建立儲存文字塊的字串
for(int i=0;i<m;i++)//輸入文字塊
{
cin>>str1[i];
}
for(int i=0;i<m;i++)//將大寫轉為小寫
{
for(int j=0;j<n;j++)
{
if(str1[i][j]<'a')
{
str1[i][j]=str1[i][j]+32;
}
}
}
cin>>k;//輸入查詢的單字數量
while(k--)
{
string str2;
cin>>str2;//輸入單字
int len=str2.length();//取得該長度
for(int i=0;i<str2.length();i++)//將大寫轉為小寫
{
if(str2[i]<'a')
{
str2[i]=str2[i]+32;
}
}
now=0,f=0;//now用來知道現在在找單字第幾個字
for(int i=0;i<m&&f==0;i++)
{//雙重迴圈表示用文字塊一個一個字來比對
for(int j=0;j<n&&f==0;j++)
{
//第一個字與文字塊座標(i,j)的字一樣
//就往下方逐一比對
while(str1[i+now][j]==str2[now]&&f==0)
{
now++;//比對到一個字就+1
//使下一個迴圈可以找第二個字
if(now==len)
{//找到全部的字
cout<<i+1<<" "<<j+1<<endl;//輸出座標
//題目座標和程式座標不一樣,所以要加1
f=1;//找到的旗標打開,不會再進入回圈
}
if(i+now>=m)
{//超出文字塊範圍,不用再找
break;
}
}
//檢查右下
now=0;//now歸零,重新從第一字開始比對
while(str1[i+now][j+now]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(i+now>=m||j+now>=n)
{
break;
}
}
//檢查右
now=0;
while(str1[i][j+now]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(j+now>=n)
{
break;
}
}
//檢查右上
now=0;
while(str1[i-now][j+now]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(i-now<0||j+now>=n)
{
break;
}
}
//檢查上
now=0;
while(str1[i-now][j]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(i-now<0)
{
break;
}
}
//檢查左上
now=0;
while(str1[i-now][j-now]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(i-now<0||j-now<0)
{
break;
}
}
//檢查左
now=0;
while(str1[i][j-now]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(j-now<0)
{
break;
}
}
//檢查左下
now=0;
while(str1[i+now][j-now]==str2[now]&&f==0)
{
now++;
if(now==len)
{
cout<<i+1<<" "<<j+1<<endl;
f=1;
}
if(i+now>=m||j-now<0)
{
break;
}
}
}
}
}
}
return 0;
}
遇到問題
1超出範圍要處理
2每筆測資要空一行
文章標籤
全站熱搜