• 三解炸弹人——DFS


    原创


    枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html

    BFS解炸弹人—— https://www.cnblogs.com/chiweiming/p/9338597.html

    关于题目的介绍请看枚举解炸弹人。

    由于枚举存在漏洞,所以采用BFS或者DFS来解题。

    此篇博客用DFS解炸弹人,不管是DFS还是BFS都是通过这两种算法的全局搜索功能搜索出地图上的每个点,

    再在搜索的基础上逐个点统计出敌人数即可。

    Java 

    import java.util.*;
    
    public class bomb_Three {
        
        static int n;    //
        static int m;    //
        static int save_x;
        static int save_y;
        static int max=0;
        static int dir[][]= {{0,1},{1,0},{0,-1},{-1,0}};    //右、下、左、上
        static char maze[][];
        static int book[][];    //标记数组
        
        static void Total(int x,int y) {    //统计灭敌数
            
            int dx=x;
            int dy=y;
            int num=0;
            while(maze[dx][dy]!='#') {    //
                if(maze[dx][dy]=='G') {
                    num++;
                }
                dy++;
            }
            dx=x;
            dy=y;
            while(maze[dx][dy]!='#') {    //
                if(maze[dx][dy]=='G') {
                    num++;
                }
                dx++;
            }
            dx=x;
            dy=y;
            while(maze[dx][dy]!='#') {    //
                if(maze[dx][dy]=='G') {
                    num++;
                }
                dy--;
            }
            dx=x;
            dy=y;
            while(maze[dx][dy]!='#') {    //
                if(maze[dx][dy]=='G') {
                    num++;
                }
                dx--;
            }
            if(num>max) {
                max=num;
                save_x=x;
                save_y=y;
            }
            
        }
        
        static void DFS(int x,int y) {
            
            for(int i=0;i<4;i++) {
                int dx=x+dir[i][0];
                int dy=y+dir[i][1];
                if(dx<0 || dx>n || dy<0 || dy>m) {
                    continue;
                }
                if(maze[dx][dy]!='.' || book[dx][dy]==1) {
                    continue;
                }
                Total(dx,dy);
                book[dx][dy]=1;
                DFS(dx,dy);
            //    book[dx][dy]=0;        //这里别回溯
            }
            
        }
    
        public static void main(String[] args) {
            
            Scanner reader=new Scanner(System.in);
            n=reader.nextInt();
            m=reader.nextInt();
            maze=new char[n][m];
            book=new int[n][m];
            int start_x=reader.nextInt();    //炸弹人初始位置
            int start_y=reader.nextInt();
            for(int i=0;i<n;i++) {
                String ss=reader.next();
                maze[i]=ss.toCharArray();
            }
            for(int i=0;i<n;i++) {
                for(int j=0;j<m;j++) {
                    book[i][j]=0;
                }
            }
            Total(start_x,start_y);
            DFS(start_x,start_y);
            System.out.println("("+save_x+","+save_y+")"+" "+max);
        }
    
    }

    测试用例:

    输入:

    13 13 3 3

    #############
    #GG.GGG#GGG.#
    ###.#G#G#G#G#
    #.......#..G#
    #G#.###.#G#G#
    #GG.GGG.#.GG#
    #G#.#G#.#.#.#
    ##G...G.....#
    #G#.#G###.#G#
    #...G#GGG.GG#
    #G#.#G#G#.#G#
    #GG.GGG#G.GG#
    #############

    输出:
    (7,11) 10

    16:06:30

    2018-07-20

  • 相关阅读:
    汉诺塔
    给出一个字符串,要求插入最少的字符,使得原字符串为一个回文串
    最长回文子串
    回文数 第N个回文数
    屋子里有1到100号100盏关闭的灯
    无头结点的单链表删除一个中间结点
    单链表逆转
    编程之美2.21 加法
    在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对
    斐波那契
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9342015.html
Copyright © 2020-2023  润新知