给定一个二维数组,以字母构成,输入目标字符串,输出所对应的位置下标,从1 2 3 4排序

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define ROW 3
#define COL 4
char map[ROW][COL]={
'A','B','T','G', //0 1 2 3
'C','F','C','S', //4 5 6 7
'J','D','E','H' //8 9 10 11
};
const char* str="HSGTCF"; //目标路径可变
int path[ROW*COL]; //7 6 5 9
int pathlength=0;
bool haspath(int rows,int cols,bool visited[ROW][COL]){ //行列 是否访问过
bool ret=false;
if(pathlength==strlen(str)){ //等于要访问的字符串大小
return true;
}
if(rows>=0 && rows<ROW && cols>=0 && cols<COL && map[rows][cols]==str[pathlength] && visited[rows][cols]==false){
//如果行大于零小于3,列大于零小于4,地图上的点一个个匹配,该元素没有被访问过,第一个为H,匹配rows=2 cols=3
path[pathlength]=rows*COL+cols; //例如是第两行两列元素,下标为[1][1],path[0]=1*4+1=5 按0 1 2 3 4 5 6 排列,,path[0]=11
pathlength++; //值加一 //该第2个元素了,下标加为1
visited[rows][cols]=true; //访问标志记为已被访问过 该2行3列元素已被访问过
//第一次H左边的元素没有被访问过为false true false true
ret = haspath(rows,cols-1,visited) || haspath(rows-1,cols,visited) || haspath(rows,cols+1,visited) || haspath(rows+1,cols,visited);
//函数调用,如果这个数上下左右都被访问过
if(ret==false){ //如果有一个已经被访问过
path[pathlength]=-1; //删除刚才的结点
pathlength--; //长度再减一
visited[rows][cols]=false;
}
}
return ret;
}
bool findpath(){
bool visited[ROW][COL];//表示各个位置,是否已经走过;0没有走过,1走过
memset(visited,0,sizeof (visited));
memset(path,-1, sizeof(path));
for (int rows = 0; rows < ROW; ++rows) {
for (int cols = 0; cols < COL; ++cols) {
if(haspath(rows,cols,visited))
return true;
}
}
return false;
}
int main() {
if(findpath()){
for (int i = 0; path[i] >= 0 ; ++i) {
printf("%d ",path[i]);
}
printf("\n");
}
// printf("Hello, World!\n");
return 0;
}
文章描述了一个在给定的二维字母矩阵中,通过递归函数`haspath`和`findpath`寻找目标字符串`HSGTCF`对应位置下标的算法过程,涉及矩阵遍历和路径搜索。
2600

被折叠的 条评论
为什么被折叠?



