递归:深搜dfs的常见题目
题目:https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e?tpId=295&tqId=1024684&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
刚开始确实是没有想到是dfs,只有想到了回溯。太久没有做了已经不记得解法了,深搜就是不断往深处搜索,类似迷宫题目(不过说回来,如果碰到迷宫题目还会不会解哈哈哈)。首先先找到n,m。分清楚长和高到底是谁,因为这一个问题之前也总是混淆,如果实在不记得就拿一个二维数组出来对比一下。然后接着是判断数组空,不为空才能进行接下来的深搜。遍历循环二维数组,如果这一个元素是1那么count++,然后进入深搜进入深搜,深搜第一件事情就是把当前已经遍历过的元素变为0,然后按照上下左右去深搜即可。
package com.kuang.reflection; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; public class Test07 { public int solve (char[][] grid) { int n = grid.length; if(n == 0){ return 0; } int m = grid[0].length; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if(grid[i][j] == '1'){ count++; dfs(grid,i,j); } } } return count; } public void dfs(char[][] grid,int i,int j){ int n = grid.length; //高 int m = grid[0].length; //长 grid[i][j] = '0'; //遍历四个方向 if(i - 1 >= 0 && grid[i - 1][j] == '1'){ dfs(grid,i - 1,j); } if(i + 1 < n && grid[i + 1][j] == '1'){ dfs(grid,i + 1,j); } if(j - 1 >= 0 && grid[i][j - 1] == '1'){ dfs(grid,i,j - 1); } if(j + 1 < m && grid[i][j + 1] == '1'){ dfs(grid,i,j + 1); } } public static void main(String[] args) { } }