您的位置:首页 > Web前端

剑指offer 66-矩阵中的路径

2015-06-28 11:16 162 查看
回溯法

#include<iostream>
using namespace std;

bool hasPathCore(char
4000
*matrix,int rows,int cols,int row,int col,char *str,int &pathLength,bool *visited)
{
if(str[pathLength]=='\0')
return true;
bool hasPath=false;
if(matrix[row*cols+col]== str[pathLength] &&
row>=0 && row<rows && col>=0 && col<cols && !visited[row*cols+col] )
{
++pathLength;
visited[row*cols+col] = true;

hasPath =hasPathCore(matrix,rows,cols,row+1,col,str,pathLength,visited)
||hasPathCore(matrix,rows,cols,row-1,col,str,pathLength,visited)
||hasPathCore(matrix,rows,cols,row,col+1,str,pathLength,visited)
||hasPathCore(matrix,rows,cols,row,col-1,str,pathLength,visited);
if(!hasPath)
{
--pathLength;
visited[row*cols+col] = false;
}
}
return hasPath;
}
bool HasPath(char *matrix,int rows,int cols,char *str)
{
if(matrix == NULL || rows<1 || cols<1 || str ==NULL)
return false;
bool *visited = new bool[rows*cols];
memset(visited,0,rows*cols);

int pathLength=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(hasPathCore(matrix,rows,cols,i,j,str,pathLength,visited))
{
return true;
}
}
}
return false;
}

void Test(char *testName,char *matrix,int rows,int cols,char *str,bool expected)
{
cout<<testName<<" ";
if(HasPath(matrix,rows,cols,str) == expected)
cout<<"Passed.\n";
else
cout<<"Failed.\n";
}
//ABCE
//SFCS
//ADEE

//ABCCED
void Test1()
{
char matrix[] = "ABCESFCSADEE";
char* str = "ABCCED";

Test("Test1", (char*)matrix, 3, 4, str, true);
}

//ABCE
//SFCS
//ADEE

//SEE
void Test2()
{
char matrix[] = "ABCESFCSADEE";
char* str = "SEE";

Test("Test2", (char*)matrix, 3, 4, str, true);
}

//ABCE
//SFCS
//ADEE

//ABCB
void Test3()
{
char matrix[] = "ABCESFCSADEE";
char* str = "ABCB";

Test("Test3", (char*)matrix, 3, 4, str, false);
}

//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS

//SLHECCEIDEJFGGFIE
void Test4()
{
char matrix[] = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
char* str = "SLHECCEIDEJFGGFIE";

Test("Test4", (char*)matrix, 5, 8, str, true);
}

//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS

//SGGFIECVAASABCEHJIGQEM
void Test5()
{
char matrix[] = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
char* str = "SGGFIECVAASABCEHJIGQEM";

Test("Test5", (char*)matrix, 5, 8, str, true);
}

//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS

//SGGFIECVAASABCEEJIGOEM
void Test6()
{
char matrix[] = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
char* str = "SGGFIECVAASABCEEJIGOEM";

Test("Test6", (char*)matrix, 5, 8, str, false);
}

//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS

//SGGFIECVAASABCEHJIGQEMS
void Test7()
{
char matrix[] = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
char* str = "SGGFIECVAASABCEHJIGQEMS";

Test("Test7", (char*)matrix, 5, 8, str, false);
}

//AAAA
//AAAA
//AAAA

//AAAAAAAAAAAA
void Test8()
{
char matrix[] = "AAAAAAAAAAAA";
char* str = "AAAAAAAAAAAA";

Test("Test8", (char*)matrix, 3, 4, str, true);
}

//AAAA
//AAAA
//AAAA

//AAAAAAAAAAAAA
void Test9()
{
char matrix[] = "AAAAAAAAAAAA";
char* str = "AAAAAAAAAAAAA";

Test("Test9", (char*)matrix, 3, 4, str, false);
}

//A

//A
void Test10()
{
char matrix[] = "A";
char* str = "A";

Test("Test10", (char*)matrix, 1, 1, str, true);
}

//A

//B
void Test11()
{
char matrix[] = "A";
char* str = "B";

Test("Test11", (char*)matrix, 1, 1, str, false);
}

int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
Test9();
Test10();
Test11();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: