比较裸的搜索题,从矩阵的每一个位置开始搜索,看能不能达成一个成功的字符串
这道题给出的矩阵是按一维字符串给的。所以(x,y)应该是x*cols+y

#include<iostream>
#include<cstring>
using namespace std;
class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        for(int i = 0 ; i < rows ; i++)
        {
            for(int j = 0 ; j < cols ; j++)//从矩阵的每一个位置搜索
            {
                memset(visit,0,sizeof(visit));//注意初始化
                if(judge(matrix,rows,cols,str,i,j,0))
                {
                    return true;
                }
            }
        }
        return false;
    }
    bool visit[10000];
    int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
    bool judge(char* matrix, int rows, int cols, char* str, int x, int y,int index)
    {
        visit[x*cols+y]=true;
        if(str[index]!=matrix[x*cols+y]){return false;}
        if(index == strlen(str)-1){return true;}
        for(int i = 0 ; i < 4 ; i++)
        {
            int tx,ty;
            tx = x+dir[i][0];
            ty = y+dir[i][1];
            if(tx>=0&&tx<rows&&ty>=0&&ty<cols&&(!visit[tx*cols+ty]))
            {
                if(judge(matrix,rows,cols,str,tx,ty,index+1)){return true;}
                visit[tx*cols+ty]=false;//注意回溯的时候恢复状态
            }
        }
        return false;
    }

};

int main()
{
    Solution S;
    char G[1000];
    cin >>G;
    int r,c;
    cin >>r >> c;
    char s[100];
    cin >>s;
    cout<<S.hasPath(G,r,c,s);
    return 0;
}
/*
abcesfcsadee
4 4
bcced

ABCESFCSADEE
3 4
ABCB

ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS
5 8
SLHECCEIDEJFGGFIE

ABCEHJIG
SFCSLOPQ
ADEEMNOE
ADIDEJFM
VCEIFGGS
*/