其他分享
首页 > 其他分享> > dfs

dfs

作者:互联网

1.迷宫

image-20220821204227328

public class Point {
  int x;
  int y;
  public Point(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
public class keda2 {
  List<Point> temp =new LinkedList<>();
  List<Point> result =new LinkedList<>();
  int minCount =Integer.MAX_VALUE;
  public ArrayList<Point> winMazeGift(int[][] maze) {
      // write code here
      Point gift =null;
      boolean flag=false;

      int n = maze.length;
      int m = maze[0].length;
      ArrayList<Point> ans = new ArrayList<>();
      //找到礼物点
      for (int i = 0; i < 4; i++) {
          for (int j = 0; j < 4; j++) {
                  if (maze[i][j] == 8) {
                      gift=new Point(i,j);
                      flag=true;
                      temp.add(new Point(i,j));
                      break;
                  }
          }
          if(flag) break;
      }
      //从礼物点回溯
      dfs(gift,0,maze);
      //正序输出
      ArrayList<Point> finalResult=new ArrayList<>();
      while (!result.isEmpty()){
          finalResult.add(result.get(result.size()-1));
          result.remove(result.size()-1);
      }
      return finalResult;
  }
  private void dfs(Point gift,int count,int [][] maze){
      //若走到边界,说明发现了路径,比较是否最短
      if(gift.x==0||gift.x==3||gift.y==0||gift.y==3){
          if(count< minCount){
              result =new LinkedList<>(temp);
              minCount =count;
          }
          return;
        }
      //判断下个点能不能走,上下左右四个方向,
      if(maze[gift.x-1][gift.y]==0){
          Point point1=new Point(gift.x-1,gift.y);
          //下个点加入路径
          temp.add(point1);
          //将当前点设置为-1,表示不可走(不加的话来回走,超时)
          int kk=maze[gift.x][gift.y];
          maze[gift.x][gift.y]=-1;
          //向下递归
          dfs(point1,count+1,maze);
          maze[gift.x][gift.y]=kk;
          temp.remove(temp.size()-1);
      }
      if(maze[gift.x+1][gift.y]==0){
          Point point2=new Point(gift.x+1,gift.y);
          temp.add(point2);
          int kk=maze[gift.x][gift.y];
          maze[gift.x][gift.y]=-1;
          dfs(point2,count+1,maze);
          maze[gift.x][gift.y]=kk;
          temp.remove(temp.size()-1);
      }
      if(maze[gift.x][gift.y-1]==0){
          Point point3=new Point(gift.x,gift.y-1);
          temp.add(point3);
          int kk=maze[gift.x][gift.y];
          maze[gift.x][gift.y]=-1;
          dfs(point3,count+1,maze);
          maze[gift.x][gift.y]=kk;
          temp.remove(temp.size()-1);
      }

      if(maze[gift.x][gift.y+1]==0){
          Point point3=new Point(gift.x,gift.y+1);
          temp.add(point3);

          int kk=maze[gift.x][gift.y];
          maze[gift.x][gift.y]=-1;
          dfs(point3,count+1,maze);
          maze[gift.x][gift.y]=kk;
          temp.remove(temp.size()-1);
      }
  }
}


2.小数

image-20220821204506849

public class keda {
  public static void main(String[] args) {
      seqSum(2);
  }

  public static float seqSum (int n) {
      double p=1;
      double q=2;
      double total=0;
      double sum=0;
      for(int i=1;i<=n;i++){
          total=p/q;
          double temp=q;
          q=p+q;
          p=temp;
          sum+=total;
      }
      NumberFormat nf=NumberFormat.getNumberInstance();
      nf.setMaximumFractionDigits(2);
      //         return (float) String.format("%。2f",total);
      return Float.parseFloat(nf.format(total));
  }
}

3.

两个正整数a,b;有一种操作:删除这两个数中的一个数位,使得a是b的倍数或者b是a的倍数。问最少要操作几次。如 a = 1246,b = 9;可以删除a的一个数位得到126,是9的倍数,因此最少操作一次。 一个字符串,只包含'r'、'e'、'd'三种字符,有一种操作:可以将一个字符替换为其他两种字符。规定字符'e'的左右两个字符有'r'和'd'的,就叫做好'e'。现在需要使字符串中的好'e'数量最多,问最少需要操作多少次? 举例:reddr,操作一次变成 reder,有两个好'e'。 类似于锯齿数组。给一个数组,每次可以对一个元素值加1操作,现在需要保证数组中的每个元素的左右两个元素相等,且中间的元素不等于左右两个元素。问最少需要操作多少次。 网易给出的样例是: [1,1,4,5,1,4],最终变成[4,5,4,5,4,5]。为什么到处都有homo啊(恼)。 又是三元组问题。一个数组,n <= 100000,arr[i] <= 10^9;需要找到这样的三元组<i,j,k>,i < j < k,且 ai == ak && ai > aj。问有多少个。

1.
public class aug1 {
  public static void main(String[] args) {
      Scanner in=new Scanner(System.in);
      int a= in.nextInt();
      int b=in.nextInt();
      String valuea=a+"";
      String valueb=b+"";
      int n=valuea.length();
      int m=valueb.length();
      List<String> ans1= cutDownList(valuea.toString());
      List<String> ans2= cutDownList(valueb.toString());
      int res=Integer.MAX_VALUE;
      for (int i = 0; i <ans1.size() ; i++) {
          for (int j = 0; j < ans2.size() ; j++) {
              String tempa=ans1.get(i);
              String tempb=ans2.get(j);
              if(is(Integer.parseInt(tempa),Integer.parseInt(tempb))){
                  int tmp=n-tempa.length()+m-tempb.length();
                  res=Math.min(res,tmp);
              }
          }
      }
      System.out.println(res);
  }
  public static boolean is(int a,int b){
      if(a%b==0 || b%a ==0) return true;
      else return false;
  }
  public static List<String> cutDownList(String str){
      char [] chars=str.toCharArray();
      String path="";
      List<String> ans=new ArrayList<>();
      process(chars,0,ans,path);
      return ans;
  }
  public static void process(char[] chars,int index,List<String> ans,String path){
    if(index ==chars.length){
        if(path.equals("")) return;
        ans.add(path);
        return;
    }
    process(chars,index+1,ans,path);
    process(chars,index+1,ans,path+chars[index]);

  }

}
2.
/**
* 输入6
* 1 1 4 5 1 4
* 输出11
* {得到长城 {4,5,4,5,4,5}}
*/
public class aug2 {
   public static void main(String[] args) {
       Scanner sc=new Scanner(System.in);
       int n=sc.nextInt();
       int nums[]=new int[n];
       for (int i = 0; i <n ; i++) {
           nums[i]=sc.nextInt();
      }
       int temp1=0,temp2=0;
       //long ans1=0,ans2=0;
       for (int i = 0; i <n ; i++) {
           if(i%2==1){
               //ans1+=nums[i];
               temp1=Math.max(temp1,nums[i]);
          }
           else {
              // ans2+=nums[i];
               temp2=Math.max(temp2,nums[i]);
          }
      }
       if(temp1==temp2){
           temp2++;
      }
       long res=0;
       for (int i = 0; i <n ; i++) {
           if(i%2==1){
               res+=temp1-nums[i];
          }
           else {
               res+=temp2-nums[i];
          }
      }
       System.out.println(res);
  }
}
3.
public class aug3 {
   public static void main(String[] args) {
       Scanner in=new Scanner(System.in);
       String str=in.nextLine();
       char [] ch=str.toCharArray();
       int n=ch.length;
       if(n%2==0){
           long ans=func(ch,0,n-2,'a');
           for (int i = 0; i <n ; i++) {
               long tmp=func(ch,0,i,'a')+func(ch,i+1,n-1,'a');
               ans=Math.min(ans,tmp);
          }
           System.out.println(ans);
      }else {
           long ans=func(ch,0,n-1,'a');
           System.out.println(ans);
      }
       return;
  }
   public static long func(char[] ch,int begin,int end,char first) {
       if(first == 'a'){
           return Math.min(func(ch,begin,end,'r'),func(ch,begin,end,'d'));
      }
       if(begin>=end){
           return 0;
      }
       char next=first;
       long cnt =0;
       for (int i = begin; i <=end; i++) {
           if((i-begin)%2 == 0){
               if(ch[i] != next){
                   cnt++;
              }
               next =next=='r'?'d':'r';
          }else {
               if(ch[i] != 'e'){
                   cnt++;
              }
          }
      }
       return cnt;
  }
}
4.
public class aug4 {
  public static void main(String[] args) {
      Scanner in=new Scanner(System.in);
      int n=in.nextInt();
      int nums[]=new int[n];
      for (int i = 0; i < n; i++) {
          nums[i]=in.nextInt();
      }
      int res=0;
      for (int i = 0; i <n ; i++) {
          int sum=0;
          for (int j = i+1; j <n ; j++) {
              if(nums[j]<nums[i]){
                  sum++;
              }
              else if(nums[j]==nums[i]){
                  res+=sum;
              }
          }
      }
      System.out.println(res);
  }
}
5.zijie2
package com.zijie;

import java.util.Scanner;

/**
* @Author:txd
* @Date:2022/8/21
* @Description:
*/
public class aug21_2 {
  public static int [][] visited;
    public static int x,y;
    public static void main(String[] args) {
      Scanner sc=new Scanner(System.in);
      int n=sc.nextInt();
      int m=sc.nextInt();
      char [][] positions=new char[n][m];
      int [][] visitor=new int[n][m];
      for (int i = 0; i < n ; i++) {
          for (int j = 0; j < m ; j++) {
              positions[i][j]=sc.next().charAt(0);
          }
      }
      //找到出口点 xStart yStart
      for (int i = 0; i < n ; i++) {
          for (int j = 0; j < m ; j++) {
              if(positions[i][j]=='O'){
                  y=j;
                  x=i;
                  visitor[i][j]=1;
              }
            }
      }
        dfs(x-1,y,'D',positions,visitor);
        dfs(x+1,y,'U',positions,visitor);
        dfs(x,y-1,'R',positions,visitor);
        dfs(x,y+1,'L',positions,visitor);
        int ans=0;
        for (int i = 0; i < n ; i++) {
            for (int j = 0; j < m ; j++) {
                if(visitor[i][j]==1){
                  ans++;
                }
            }
        }
        System.out.println(n*m-ans);

  }
  public static void dfs(int i,int j,char c,char position [][],int visitor[][]){
      if(i==x&&j==y){
          return;
      }
      if(i<0 || i>=position.length ||j<0 ||j>=position[0].length){
          return;
      }
      if(position[i][j]=='.' || position[i][j]==c){
          visitor[i][j]=1;
          dfs(i-1,j,'D',position,visitor);
          dfs(i+1,j,'U',position,visitor);
          dfs(i,j-1,'R',position,visitor);
          dfs(i,j+1,'L',position,visitor);
      }

  }
}
 

标签:temp,gift,int,dfs,new,maze,public
来源: https://www.cnblogs.com/ttxxdd/p/16611546.html