【DP】判断在矩阵A中是否存在一条路径与数组s相同

题目:EPI


提示:利用递归,且为了避免做重复工作,应该保存每一个查找失败的查询工作——实际上就是动态规划的思想。

class comparestr
{
public:
	int i,j,k;
	comparestr(int ii,int jj,int kk):i(ii),j(jj),k(kk){}
	const bool operator==(const comparestr &a)const
	{
		return i==a.i && j==a.j && k==a.k;
	}
};

struct HashComparestr
{
	const bool operator()(const comparestr &a)const
	{
		return hash<int>()(a.i)+hash<int>()(a.j)+hash<int>()(a.k);
	}
};

bool match_core(const vector<vector<int>> &A,const vector<int> &s,unordered_set<comparestr,HashComparestr>  &cache,const int i,const int j,const int k)
{
	if(k==s.size())
		return true;
	if(i<0 || i>=A.size() || j<0 || j>=A[0].size())
		return false;
	comparestr tmp(i,j,k);
	if(cache.find(tmp)!=cache.end())
		return false;


	if(A[i][j]==s[k] && ( match_core(A,s,cache,i+1,j,k+1) || match_core(A,s,cache,i-1,j,k+1) || match_core(A,s,cache,i,j+1,k+1) || match_core(A,s,cache,i,j-1,k+1) ) )
	{
		cout<<i<<"  "<<j<<"  "<<k<<endl;
		return true;
	}
	cache.emplace(i,j,k);
	return false;
}

bool match(const vector<vector<int>> &A,const vector<int> &s)
{
	if(A.empty() || s.empty())
		throw new exception;
	unordered_set<comparestr,HashComparestr>  cache;
	for(int i=0;i<A.size();i++)
	{
		for(int j=0;j<A[i].size();j++)
		{
			if(A[i][j]==s[0] && match_core(A,s,cache,i,j,0))
				return true;
		}
	}
	return false;
}


阅读更多
文章标签: c++ 程序员 面试
个人分类: 程序员面试题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

【DP】判断在矩阵A中是否存在一条路径与数组s相同

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭