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每筆測資要空一行

arrow
arrow
    創作者介紹
    創作者 豪CO 的頭像
    豪CO

    程式道路,必為豐富

    豪CO 發表在 痞客邦 留言(0) 人氣()