publicP(int x, int y){ this.x = x; this.y = y; if (x < 0 || y < 0 || x >= X || y >= Y) { c = ' '; } else { this.c = mat[Y * x + y]; } }
@Override publicbooleanequals(Object obj){ return x == ((P) obj).x && y == ((P) obj).y; }
@Override publicinthashCode(){ int i = Integer.valueOf(x + "" + y); return i; } }
publicbooleanhasPath(char[] matrix, int rows, int cols, char[] str){ mat = matrix; this.str = str; X = rows; Y = cols; List<P> list = findFirst(str[0]); for (P p : list) { if (findPath(p)) { returntrue; } } returnfalse; }
Set<P> set = new HashSet<>(); boolean ok = false;
privatebooleanfindPath(P p){ ok = false; set.clear(); dfs(p, 0); if (ok) { returntrue; } else { returnfalse; } }
privatevoiddfs(P p, int i){
if (ok || p.c == ' ' || set.contains(p)) { return; } if (p.c == str[i]) { if (i == str.length - 1) {/** 路径找到了 */ ok = true; return; } set.add(p); dfs(new P(p.x + 1, p.y), i + 1); dfs(new P(p.x - 1, p.y), i + 1); dfs(new P(p.x, p.y + 1), i + 1); dfs(new P(p.x, p.y - 1), i + 1); } }
private List<P> findFirst(char c){ List<P> list = new ArrayList<>(); for (int i = 0; i < X; i++) { for (int j = 0; j < Y; j++) { P p = new P(i, j); if (p.c == c) { list.add(p); } } } return list; }
// 几个全局变量,便于程序的简洁,只是在刷题中建议 char *mat = 0; int h = 0, w = 0; int str_len = 0; int dir[5] = {-1, 0, 1, 0, -1}; boolhasPath(char* matrix, int rows, int cols, char* str) { mat = matrix; h = rows, w = cols; str_len = strlen(str);
for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (dfs(i, j, 0, str)) { returntrue; } } } returnfalse; }
classSolution { public: char *mat = 0; int h = 0, w = 0; int str_len = 0; int dir[5] = {-1, 0, 1, 0, -1};
booldfs(int i, int j, int pos, char *str){ // 因为dfs调用前,没有进行边界检查, // 所以需要第一步进行边界检查, // 因为后面需要访问mat中元素,不能越界访问 if (i < 0 || i >= h || j < 0 || j >= w) { returnfalse; }