`
128kj
  • 浏览: 600174 次
  • 来自: ...
社区版块
存档分类
最新评论

深度优先搜索学习五例之五(JAVA)

阅读更多
一、深度优先搜索遍历磁盘文件目录
import java.io.File;
import java.io.IOException;
import java.util.Stack;
import java.util.Queue;
import java.util.LinkedList;
public class ListFile{
        public static void main(String[] args) throws IOException {
              File file = new File("c:/java");
               DFS1(file);
               System.out.println("--------------------------------------");
               System.out.println("--------------------------------------");
                DFS2(file);
              
        }
        // 文件深度优先遍历,栈实现
        private static void DFS1(File file) throws IOException {
               Stack< File> stack = new Stack< File>();
               stack.push(file);//当前目录进栈
               File fileInStack = null;
             while (!stack.isEmpty()) {
              fileInStack = stack.pop();
              System.out.println("dir:" + fileInStack.getCanonicalPath());//访问当前目录
              File[] files = fileInStack.listFiles();//当前目录的所有邻接点
                 for (File eachFile : files) {
                    if (eachFile.isFile()) {
                        System.out.println("file:" + eachFile.getCanonicalPath());
                    } else {
                         stack.push(eachFile);//邻接点进栈
                    }
                  }
                }
        }

        // 文件深度递归遍历
        private static void DFS2(File file) throws IOException {
             System.out.println("dir:" + file.getCanonicalPath());
             File[] files = file.listFiles();
             for (File eachFile : files) {
               if (eachFile.isFile()) {
                   System.out.println("file:" + eachFile.getCanonicalPath());
               } else {
                   DFS2(eachFile);
                 
             }
          }
     }
     
}




二、POJ 1501
题意:给出一个字符矩阵和多行单词,然后看字符矩阵中是否有和这些单词匹配的单词,只能按照直线(横、竖、斜)进行匹配,如果匹配成功则输出首字母和末字母匹配成功的位置,没有则输出Not found。样例如下:

Sample Input

5
EDEEE
DISKE
ESEEE
ECEEE
EEEEE
DISC
DISK
DISP
0
Sample Output

1,2 4,2
2,1 2,4
Not found


思路:遍历字符矩阵中的每一个字符,看其是否与所给单词的第一字符相同,如果相同则DSF继续搜索下一个字母。

import java.util.Arrays;
import java.util.Scanner;
public class Main{
 private char c[][];  //字符矩阵
 private int n;  //字符矩阵的大小n*n
 private String s;//在字符中要找的单词
 private boolean flag;//匹配成功的标志
 private boolean vis[][];  //状态数组
 private int sx,sy,ex,ey;//匹配成功后,首字母和末字母匹配成功的位置

 private int dir[][]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1}};  

   public Main(int n,String s,char[][] c){
      this.n=n;
      this.s=s;
      this.c=c;
      flag=false;
      vis=new boolean[n][n];
   }


  private void dfs(int i,int j,int m,int k) {  
    int x,y;  
    if(flag) return;  
     //深搜结束条件,必须加个m==s.length()因为给出的字符串可能有重复字母   

      if((c[i][j]==s.charAt(s.length()-1))&&m==s.length()) {  
      ex=i;ey=j;  //记录匹配成功末字符位置
      flag=true;   
      return;  
     }  
    x=i+dir[k][0];  
    y=j+dir[k][1];  
    if(x>=0&&x<n&&y>=0&&y<n&&c[x][y]==s.charAt(m)&&!vis[x][y])  
    {  
      vis[x][y]=true;  
      dfs(x,y,m+1,k);  //同一方向,搜索下一个字符
      vis[x][y]=false;  
    }  
  }  
  
   public static void main(String args[]){ 
     Scanner in=new Scanner(System.in);
     String s="";
     int n=in.nextInt();  
     char[][] c=new char[n][n];
 
     for(int i=0;i<n;i++){
      s=in.next();
       for(int j=0;j<n;j++)
          c[i][j]=s.charAt(j);
      }

     
     while(true)  { 
      s=in.next();
      if(s.equals("0")) break;  
       Main main=new Main(n,s,c);
       main.go();
     }
   }

 private void go(){
  
     for(int i=0;i<n;i++)
       for(int j=0;j<n;j++)  
         if(c[i][j]==s.charAt(0)){//找到第一个字母后,按同一个方向搜索   
           for(int k=0;k<8;k++){  
             dfs(i,j,1,k);  
             if(flag)   
             {   
               sx=i;sy=j;   
               System.out.printf("%d,%d %d,%d\n",sx+1,sy+1,ex+1,ey+1); 
               return;
             }  
           }  
         }  
      
       if(!flag) System.out.printf("Not found\n");  
   }  
  
}  
分享到:
评论

相关推荐

    深度优先搜索学习五例之四(JAVA)

    在这个“深度优先搜索学习五例之四”的主题中,我们将重点关注使用Java实现DFS解决具体问题的情况。这篇博客文章可能通过一个具体的实例,如迷宫求解,来演示如何利用DFS进行递归或栈操作。 首先,我们来看"MazeDsf...

    深度优先搜索学习五例之三(JAVA)

    深度优先搜索(DFS, Depth-First Search)是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着某一条路径一直深入到叶子节点,然后再回溯寻找其他路径。在本例中,我们有两个Java文件:MazeDsf.java 和 Queen....

    深度优先搜索学习五例之一(JAVA)

    在这个主题"深度优先搜索学习五例之一(JAVA)"中,我们可以期待看到至少五个不同的应用实例,这些实例将用Java语言实现,可能包括但不限于以下场景: 1. **图的遍历**:DFS可以用于遍历无向图或有向图,通过访问每...

    广度优先搜索学习五例之二(JAVA)

    通常,这样的教程会包括代码实现、步骤解析以及为什么选择BFS而不是深度优先搜索(Depth-First Search, DFS)的原因。 【标签】:“源码”、“工具” “源码”标签表明文章会包含实际的Java代码示例,读者可以参考...

    广度优先搜索学习五例之三

    2. Main1.java:这个文件可能是对BFS的另一种实现,或者是辅助Main.java进行特定任务的类,比如提供额外的测试用例,或者实现了与BFS相关的其他算法(如深度优先搜索DFS)进行对比。 综上所述,这个压缩包文件的...

    广度优先搜索学习五例之五

    在给定的"广度优先搜索学习五例之五"中,我们可能探讨的是一个具体的应用场景或者变体,但描述中并未提供详细信息。通常,BFS 的实现涉及以下几个关键元素: 1. **队列(Queue)**:BFS 使用队列作为主要的数据结构...

    JAVA算法100例

    - **深度优先搜索(DFS)**:递归地探索节点的邻接节点,用于遍历或搜索图。 - **广度优先搜索(BFS)**:使用队列数据结构,按照距离从起点到终点的顺序访问节点。 4. **动态规划(DP)**: - **斐波那契数列**:使用...

    JAVA算法100例,全源码.zip

    2. **搜索算法**:如线性搜索、二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)等,这些是解决查找问题的基础,对于理解数据结构至关重要。 3. **图论算法**:例如Dijkstra最短路径算法、Floyd-Warshall所有对...

    华为机考100例java.rar

    9. **DFS(深度优先搜索)算法**:DFS是一种用于遍历或搜索树或图的算法,沿着树的深度遍历树的节点,尽可能深地搜索树的分支。在Java中,DFS可以借助于递归或栈来实现。 这些知识点涵盖了计算机科学基础和算法设计...

    java经典算法40例+答案

    2. **搜索算法**:二分查找、线性查找、深度优先搜索(DFS)和广度优先搜索(BFS),这些算法在处理数据集合时非常实用。 3. **图论算法**:Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法,它们在网络...

    [java软件技术文档doc]java经典算法40例

    2. **搜索算法**:二分查找、深度优先搜索、广度优先搜索等,探讨如何在数据结构中高效地查找目标元素。 3. **数据结构**:栈、队列、链表、树、图等,如何利用它们来实现各种算法。 4. **动态规划**:如斐波那契...

    java 对文件夹目录进行深度遍历实例代码

    深度遍历(又称深度优先遍历)是指沿着树的深度遍历树的节点,尽可能深地搜索树的分支,当节点v的所有出边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。在目录结构中,这意味着如果当前遍历到的文件是...

    java实现的求迷宫最短路径算法

    这个类可能实现了A*算法、Dijkstra算法或者深度优先搜索(DFS)等常见的寻找最短路径的算法。这些算法的核心目标是找到从起点到终点的最短路径,同时尽量避免无效的探索。 以A*算法为例,它结合了Dijkstra算法的...

    [电子书][Java类]JAVA经典算法42例

    2. **搜索算法**:二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)等,这些算法在处理数据查找和遍历树形结构时非常有效。 3. **图论算法**:最短路径问题(Dijkstra算法、Floyd算法),最小生成树(Prim算法...

    java2课程设计源代码大全

    在实现这个项目时,我们可能需要学习图算法,如深度优先搜索(DFS)或广度优先搜索(BFS),用于寻找从起点到终点的最短路径。数据结构如栈或队列会在这里发挥重要作用。同时,我们需要理解如何将迷宫表示为二维数组...

    数据结构与算法分析Java语言描述第三版书中例题源代码(Mark·Allen·Weiss著)

    这些代码可能包括简单的排序算法(冒泡、选择、插入、快速、归并等)、查找算法(顺序、二分、哈希等)、图算法(深度优先搜索、广度优先搜索、最小生成树、最短路径等)以及其他复杂的数据结构实现。 5. **学习...

    JAVA经典算法收集整理 以及Java算法大全(近100种算法打包).rar

    2. **搜索算法**:如二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)。这些算法在处理大量数据时具有重要作用,如在树和图结构中寻找特定元素或路径。 3. **图论算法**:如Dijkstra最短路径算法、Floyd-...

    Java经典算法(包你们划算)

    3. **图论算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),以及Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法等。 4. **动态规划**:解决许多复杂问题的有效方法,如背包问题、最长公共子序列、...

    java象棋对战

    判断棋局胜负可能需要深度优先搜索(DFS)或广度优先搜索(BFS);而象棋的AI对战则可能涉及最小-最大搜索算法配合Alpha-Beta剪枝。 4. **状态管理**:棋盘上的每一步操作都会改变游戏的状态,这需要一个高效的数据...

Global site tag (gtag.js) - Google Analytics