1查找出岛屿的数量
这一题需要思考在使用递归时是使用广度遍历还是深度遍历!我觉得这一题是在找的时候,是需要将所有的为1的值都要变成0,只要连起来都需要变成水。所以可以想象为从一个点出发,需要找到这个点周围所有的1,所以使用广度优先搜索!
class Solution {
public int numIslands(char[][] grid) {
int m=grid.length;
int n=grid[0].length;
int result=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]=='1'){
result++;
solution(grid,i,j);
}
}
}
return result;
}
public void solution(char[][] map , int i,int j){
if(i<0||i>=map.length||j<0||j>=map[0].length||map[i][j]=='0'){
return ;
}
map[i][j]='0';
solution(map,i+1,j);
solution(map,i-1,j);
solution(map,i,j+1);
solution(map,i,j-1);
}
}
2迷宫只有一条路,并且一次走一步的问题输出路径(只有一条路径使用深度优先算法)
注意和第一题的区别!这题只是说找到一条路径即可,所以应该采用深度优先搜索的方式,当走不通之后,在进行回溯。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int rows=in.nextInt();
int clos=in.nextInt();
int[][] map = new int[rows][clos];
for(int i=0;i<rows;i++){
for(int j=0;j<clos;j++){
map[i][j]=in.nextInt();
}
}
List<Node> path= new ArrayList<>();
backTracking(map,0,0,path);
for(Node node: path){
System.out.println("("+node.x+","+node.y+")");
}
}
public static boolean backTracking(int[][] map,int x,int y,List<Node> path){
if(x==map.length-1&&y==map[0].length-1){
path.add(new Node(x,y));
return true;
}
if(x<0||x>map.length-1||y<0||y>map[0].length-1||map[x][y]==1){
return false;
}
path.add(new Node(x,y));
map[x][y]=1;
if(backTracking(map,x-1,y,path)){
return true;
}
if(backTracking(map,x+1,y,path)){
return true;
}
if(backTracking(map,x,y+1,path)){
return true;
}
if(backTracking(map,x,y-1,path)){
return true;
}
map[x][y]=0;
path.remove(path.size()-1);
return false;
}
}
class Node{
int x;
int y;
public Node(int x,int y){
this.x=x;
this.y=y;
}
}
3迷宫有多条路径,每次走一步,问最短的路径(因为有多条路径,所以需要广度优先搜索)
import java.util.*;
public class Main {
public static ArrayList<int[]> path = new ArrayList<>();
public static ArrayList<int[]> best_path = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
path.clear();
best_path.clear();
int n = in.nextInt();
int m = in.nextInt();
int[][] maze = new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
maze[i][j] = in.nextInt();
}
}
dfs(0,0,maze);
for(int[] pathi:best_path){
System.out.println("(" + pathi[0] + "," + pathi[1] + ")");
}
}
}
public static void dfs(int i,int j,int[][] maze){
if(i<0 || i>maze.length-1 || j<0 || j>maze[0].length-1){
return;
}
if(maze[i][j]==1){
return;
}
if(i==maze.length-1 && j==maze[0].length-1){
path.add(new int[]{maze.length-1,maze[0].length-1});
if(best_path.size()==0 || path.size()<best_path.size()){
best_path.clear();
for(int[] path0:path){
best_path.add(path0);
}
}
return;
}
maze[i][j] = 1;
path.add(new int[]{i,j});
dfs(i-1,j,maze);
dfs(i+1,j,maze);
dfs(i,j-1,maze);
dfs(i,j+1,maze);
maze[i][j] = 0;
path.remove(path.size()-1);
}
}
3迷宫有多条路径,每次最多走k步,问最少几步能走到?
(需要学习,暂时还没有解决,有好的解决办法记得踢我一脚。。。)
|