lost in city (修改后,时间大幅度减少,所以系统的find函数还是挺耗时的)

本文探讨了如何通过字符串匹配和路径查找算法实现特定字符序列的高效搜索,并应用于多个方向,包括上下左右四个方位的模式识别。算法涉及字符串比较、模式匹配、路径排序等关键步骤,旨在快速定位目标字符序列在给定文本中的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>


using namespace std;


bool isPattern(const string &str1,const string &str2)
{
	if(str1.length()==str2.length())
	{
		for(int i=0;i<str1.length();i++)
		{
			if(str1[i]!=str2[i])
				return false;
		}
		return true;
	}
	else
		return false;
}

void upPattern(vector<string> &vec,vector<string> &vec2,vector<pair<int,int>> &ret)
{
	int i,j;
	int N=vec.size();
	int M=vec[0].size();
	//上面是北面的情况
	for(i=0;i<N-2;i++)
	{
		for(j=0;j<M-2;j++)
			if(isPattern(vec[i].substr(j,3),vec2[0])
			    &&isPattern(vec[i+1].substr(j,3),vec2[1])
			      &&isPattern(vec[i+2].substr(j,3),vec2[2]))
				    ret.push_back(make_pair(i+2,j+2));

	}


}

void downPattern(vector<string> &vec,vector<string> &vec2,vector<pair<int,int>> &ret)
{
	int i,j;
	int N=vec.size();
	int M=vec[0].size();
	vector<string> vec3(vec);

	for(auto &s:vec3)
		reverse(s.begin(),s.end());
	reverse(vec3.begin(),vec3.end());

	//上面是南面的情况

	for(i=0;i<N-2;i++)
	{
		for(j=0;j<M-2;j++)
			if(isPattern(vec3[i].substr(j,3),vec2[0])
				&&isPattern(vec3[i+1].substr(j,3),vec2[1])
					&&isPattern(vec3[i+2].substr(j,3),vec2[2]))
				 ret.push_back(make_pair(N-(i+1),M-(j+1)));							
	}
}



void leftPattern(vector<string> &vec,vector<string> &vec2,vector<pair<int,int>>&ret)
{
	int i,j;
	int N=vec.size();
	int M=vec[0].size();

	//上面是西边的情况
	for(i=0;i<N-2;i++)
	{
		for(j=0;j<M-2;j++)
			if(isPattern(vec[i].substr(j,3),vec2[0])
				&&isPattern(vec[i+1].substr(j,3),vec2[1])
					&&isPattern(vec[i+2].substr(j,3),vec2[2]))
			{
				 ret.push_back(make_pair(M-(j+1),i+2));


			}
	}

}

void rightPattern(vector<string> &vec,vector<string> &vec2,vector<pair<int,int>>&ret)
{
	int i,j;
	int N=vec.size();
	int M=vec[0].size();
	vector<string> vec3(vec);

	pair<int,int> p;

	for(auto &s:vec3)
		reverse(s.begin(),s.end());
	reverse(vec3.begin(),vec3.end());


	//上面是东边的情况
	for(i=0;i<N-2;i++)
	{
		for(j=0;j<M-2;j++)
			if(isPattern(vec3[i].substr(j,3),vec2[0])
				&&isPattern(vec3[i+1].substr(j,3),vec2[1])
					&&isPattern(vec3[i+2].substr(j,3),vec2[2]))
		
				ret.push_back(make_pair(j+2,N-(i+1)));
	}
}

int main()
{
	
	int N,M;
	cin>>N>>M;
	vector<string> strs1;
	vector<string> strs2(M);
	vector<string> strs3;
	string line;
	getline(cin,line);
	for(int i=0;i<N;i++)
	{
	    getline(cin,line);
		strs1.push_back(line);
	}

	while(getline(cin,line))
	{
		strs3.push_back(line);
	}

	for(int i=0;i<strs1.size();i++)//按竖读入strs2
	{
		for(int j=0;j<M;j++)
			strs2[j]+=strs1[i][j];
	}

	//将strs2反转
	for(auto &s:strs2)
		reverse(s.begin(),s.end());

	vector<pair<int,int>> ret;
	upPattern(strs1,strs3,ret);
	downPattern(strs1,strs3,ret);
	leftPattern(strs2,strs3,ret);
	rightPattern(strs2,strs3,ret);


	stable_sort(ret.begin(),ret.end(),
        [](const pair<int,int> &a,const pair<int,int> &b)
        {return (a.first<b.first);});

	stable_sort(ret.begin(),ret.end(),
        [](const pair<int,int> &a,const pair<int,int> &b)
        {return (a.first==b.first)&&(a.second<b.second);});


	vector<pair<int,int>> ret2;
	ret2.push_back(ret[0]);
	for(int i=1;i<ret.size();i++)
		if(ret[i]!=ret[i-1])
			ret2.push_back(ret[i]);

	for(auto v:ret2)
		cout<<v.first<<" "<<v.second<<endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值