矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
输入: board = [["a","b"],["c","d"]], word = "abcd"
输出: false
提示:
- 1 <= board.length <= 200
- 1 <= board[i].length <= 200
- board 和 word 仅由大小写英文字母组成
class Solution {
public boolean exist(char[][] board, String word) {
if(board.length == 0 || word.length() == 0){
return false;
}
int[][] visited = new int[board.length][board[0].length];
for(int i=0; i<board.length;i++){
for(int j=0; j<board[0].length;j++){
boolean f = dfs(i,j,"", word,board,visited);
if(f){
return true;
}
}
}
return false;
}
public boolean dfs(int x, int y, String pre, String word, char[][] board, int[][] visited){
visited[x][y] = 1;
String text = pre + board[x][y];
if(text.equals(word)){
return true;
}
if(!word.startsWith(text)){
visited[x][y] = 0;
return false;
}
int[][] arr = new int[][]{{0,1},{1,0}, {0,-1}, {-1,0}};
for(int i=0; i<arr.length; i++){
int nx = x+arr[i][0];
int ny = y + arr[i][1];
if(nx <0 || ny< 0 || nx> board.length -1|| ny> board[0].length -1){
continue;
}
if(visited[nx][ny] ==1){
continue;
}
boolean flag = dfs(nx, ny, text, word, board, visited);
if(flag){
return true;
}
visited[nx][ny] = 0;
}
visited[x][y] = 0;
return false;
}
}
机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
输入: m = 2, n = 3, k = 1
输出: 3
输入: m = 3, n = 1, k = 0
输出: 1
提示:
1 <= n,m <= 1000 <= k <= 20
class Solution {
public int movingCount(int m, int n, int k) {
int[][] visited = new int[m][n];
int[][] counted = new int[m][n];
dfs(0,0,m,n,k,visited, counted);
int count =0;
for(int i=0; i<m;i++){
for(int j=0; j<n;j++){
if(counted[i][j]== 1){
count++;
}
}
}
return count;
}
public void dfs(int x, int y, int m, int n, int k, int[][] visited, int[][] counted){
if(x <0 || y<0|| x>=m ||y>=n){
return;
}
if(visited[x][y] == 1){
return;
}
visited[x][y] = 1;
if(x%10 +x/10 + y%10 +y/10 <= k){
counted[x][y] =1;
dfs(x+1, y, m, n, k, visited,counted);
dfs(x-1, y, m, n, k, visited,counted);
dfs(x, y+1, m, n, k, visited,counted);
dfs(x, y-1, m, n, k, visited,counted);
}
}
}