剑指offer-矩阵中的路径

2016/05/24 C和C++基础

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

#include <iostream>
#include <vector>
using namespace std;

void dfc(vector<vector<char> > strmat,vector<vector<bool> > mmat,
	int i,int j,char *str,int pos,bool &m){
		int row=strmat.size();
		int col=strmat[0].size();
	if(m==false){
		if(str[pos+1]=='\0')
			m=true;
		else{
			if(i-1>=0&&str[pos+1]==strmat[i-1][j]&&mmat[i-1][j]==0){                 //上遍历
				mmat[i-1][j]=1;
				dfc(strmat,mmat,i-1,j,str,pos+1,m);
			}
			if(i+1<row&&str[pos+1]==strmat[i+1][j]&&mmat[i+1][j]==0){                //下遍历
				mmat[i+1][j]=1;
				dfc(strmat,mmat,i+1,j,str,pos+1,m);
			}
			if(j-1>=0&&str[pos+1]==strmat[i][j-1]&&mmat[i][j-1]==0){                 //左遍历
				mmat[i][j-1]=1;
				dfc(strmat,mmat,i,j-1,str,pos+1,m);
			}
			if(j+1<col&&str[pos+1]==strmat[i][j+1]&&mmat[i][j+1]==0){                //右遍历
				mmat[i][j+1]=1;
				dfc(strmat,mmat,i,j+1,str,pos+1,m);
			}
		}
	}
}

bool hasPath(char* matrix, int rows, int cols, char* str){
    vector<vector<char> > strmat;
	vector<vector<bool> > mmat;
	vector<vector<int> > vecpos;
	for(int i=0;i<rows;i++){
		vector<char> tc;
		vector<bool> tm;
		for(int j=0;j<cols;j++){
			char c=matrix[i*cols+j];
			tc.push_back(c);
			tm.push_back(0);
			if(c==str[0]){
				vector<int> tp;
				tp.push_back(i);      //行
				tp.push_back(j);      //列
				vecpos.push_back(tp);
			}
		}
		strmat.push_back(tc);
		mmat.push_back(tm);
	}
	bool m=false;
	int s=vecpos.size();
	for(int i=0;i<s;i++){
		mmat[vecpos[i][0]][vecpos[i][1]]=true;
		dfc(strmat,mmat,vecpos[i][0],vecpos[i][1],str,0,m);
		mmat[vecpos[i][0]][vecpos[i][1]]=false;
		if(m)
			return 1;
	}
	return 0;
}

int main(){
	//char matrix[]="abcesfcsadee";
	//char str[]="bcced";
	//char str[]="abcb";
	//char matrix[]="ABCESFCSADEE";
	//char str[]="ABCCED";
	char matrix[]="ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
	char str[]="SGGFIECVAASABCEHJIGQEMS";
	hasPath(matrix,5,8,str);
	system("pause");
}

Search

    Post Directory