回溯法求解目标路径 单词搜索 回溯

文章描述了一个在给定的二维字母矩阵中,通过递归函数`haspath`和`findpath`寻找目标字符串`HSGTCF`对应位置下标的算法过程,涉及矩阵遍历和路径搜索。

给定一个二维数组,以字母构成,输入目标字符串,输出所对应的位置下标,从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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值