剑指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;
}
#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;
}
相关文章推荐
- JavaScript在网页中的位置
- 学习Javascript闭包(Closure)
- 理解 Javascript 的闭包
- jQuery模拟黑客帝国矩阵效果实例
- 设置input的属性placeholder属性值的样式
- mysql优化的重要参数 key_buffer_size table_cache
- 基于Angularjs实现分页
- WPF编程学习——样式
- CSS盒子模型
- 那些逐步掌握的JavaScript('arguments')
- Jsp:param标签的使用
- Extjs布局
- CSS实现背景透明,文字不透明(各浏览器兼容)
- javascript中遇到的字符串对象处理
- WPF编程—样式
- Qt 出现“undefined reference to `vtable for”原因总结
- jquery mobile 问问多多
- 剑指offer 64-数据流中的中位数
- nodejs简单二维码生成
- CSS3学习笔记-1:CSS样式继承