枚举 + 深度搜索 ----炸弹人
2018-01-29 16:36
253 查看
package com.xjj.Ah; /*---枚举 + 深度搜索 ----炸弹人---- * 1. 炸弹能到达的地方最多能炸死的敌人数 * 2. 用枚举法来获得每个空格放置炸弹能炸死的敌人数,用深度搜索法来获得能达到的地方 * 3. 先沿着一个方向深度搜索,遇到墙,在将此点四个方向都遍历完就返回, * 4. book[][] 标记是否已经遍历 * * 5. 深度优先搜索关键:当下该怎么做,下一步与当下相同; * 基本模型 * void dfs(int step) * { * 判断边界--return * 尝试每一种可能 * for(int i = 1; i <= n; i++) * { * 继续下一步 dfs(step+1); * } * 返回 * } * */ public class Ah_4_41 { static int N = 13; static int M = 13; //标记是否已经遍历 int[][] book = new int [M]; //方向数组 int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}}; int max = 0, X = 0, Y = 0; //‘#’为墙,‘H’为空格,‘G’为敌人 static char[][] a = {{'#','#','#','#','#','#','#','#','#','#','#','#','#'}, {'#','G','G','H','G','G','G','#','G','G','G','H','#'}, {'#','#','#','H','#','G','#','G','#','G','#','G','#'}, {'#','H','H','H','H','H','H','H','#','H','H','G','#'}, {'#','G','#','H','#','#','#','H','#','G','#','G','#'}, {'#','G','G','H','G','G','G','H','#','H','G','G','#'}, {'#','G','#','H','#','G','#','H','#','H','#','H','#'}, {'#','#','G','H','H','H','G','H','H','H','H','H','#'}, {'#','G','#','H','#','G','#','#','#','H','#','G','#'}, {'#','H','H','H','G','#','G','G','G','H','G','G','#'}, {'#','G','#','H','#','G','#','G','#','H','#','G','#'}, {'#','G','G','H','G','G','G','#','G','H','G','G','#'}, {'#','#','#','#','#','#','#','#','#','#','#','#','#'}, }; //返回该点可炸死敌人的数目,枚举法 public int getNum(int i, int j){ int sum=0,x,y; //向上统计 x = i; y = j; while(a[x][y] != '#'){ if (a[x][y] == 'G') sum++; x--; } //向下统计 x = i; y = j; while(a[x][y] != '#'){ if (a[x][y] == 'G') sum++; x++; } //向左统计 x = i; y = j; while(a[x][y] != '#'){ if (a[x][y] == 'G') sum++; y--; } //向右统计 x = i; y = j; while(a[x][y] != '#'){ if (a[x][y] == 'G') sum++; y++; } return sum; } //深度优先搜索 public void dfs(int x, int y){ //获得该点能炸死的敌人数 int sum = getNum(x, y); //更新 if (sum > max) { max = sum; X = x; Y = y; } //枚举四个方向,先从右开始,下左上 for(int k = 0; k <= 3; k++){ int tx = x + dir[k][0]; int ty = y + dir[k][1]; //判断是否越界 if (tx > N-1 || tx < 1 || ty > M-1 || ty < 1) continue; //如果为空格且未标记 if (a[tx][ty] == 'H' && book[tx][ty] == 0) { book[tx][ty] = 1; //一定记得先标记,不然递归回进入死循环 dfs(tx, ty); //朝着一个方向深度搜索 } } return; //遍历完四个方向则返回上一个点 } public static void main(String[] args) { Ah_4_41 ah = new Ah_4_41(); ah.dfs(3, 3); System.out.println("坐标为: " + ah.X + " " + ah.Y); System.out.println("最大敌人为: " + ah.max); } }
相关文章推荐
- 深度优先搜索+解炸弹人游戏
- 再解炸弹人--广度搜索和深度搜索
- USACO-Section1.3 Wormholes 【深度优先搜索】【暴力枚举】
- 深度优先搜索——毕业BG
- DFS深度搜索算法实现深度探究解析-以POJ 1040为例
- 深度搜索的应用----无向图的连通性
- ×××××#######Keras/Python深度学习中的网格搜索超参数调优(附源码)(译文)+++++++
- 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题
- nyoj 部分和问题(深度优先搜索DFS)
- 【POJ 2785 4 Values whose Sum is 0】+ 折半枚举(双项搜索))
- 无向图----深度优先搜索
- 深度优先搜索检测有向图有无环路算法
- 深度优先状态搜索法
- 深度优先搜索的用法——lake counting
- 深度优先搜索DFS
- C++深度优先搜索的实现方法
- 深度优先搜索 DFS 算法摘记
- 大快搜索大数据运维管理平台深度解析
- 深度优先搜索
- 深度优先搜索DFS