万能的搜索3

  大家小的时候都玩过迷宫的游戏,迷宫里面有障碍物有一个出口,和一个入口,通过入口,走到出口,你就找到一条路线。

  

package 中介者设计模式;

import java.util.Scanner;

public class MainMain {

	private static int col = 0;
	private static int row = 0;

	//地图
	private static int a[][] = new int[50][50];

	//标记地图中的点
	private static int book[][] = new int[50][50];

	//路径的个数
	private static int min = 99999;

	//读入入口的坐标
	static	int startx = 0;
	static	int starty = 0;

			//读入出口的坐标
	static	int endx = 0;
	static	int endy = 0;

	public static void main(String[] args) {

		for (int i = 0;i<a.length;i++) {
			for (int j = 0;j<a[i].length;j++) {
				a[i][j]=0;
				book[i][j]=0;
			}
		}

		Scanner input = new Scanner(System.in);
		row = input.nextInt();//行
		col = input.nextInt();//列

		//读入地图
		for (int i = 1; i<=row;i++) {
			for (int j = 1;j<=col;j++) {
				a[i][j] = input.nextInt();
			}
		}

		//读入入口的坐标
		 startx = input.nextInt();
		 starty = input.nextInt();

		//读入出口的坐标
		 endx = input.nextInt();
		 endy = input.nextInt();

		//从入口的位置开始搜索
		book[startx][starty] = 1;//标记为1代表已经在路径中,防止以后重复走,0代表还没有走。
		dfs(startx,starty,0);
		System.out.println(min);

	}

	private static void dfs(int startx, int starty, int step) {
		//定义一个方向数组
		int next[][] = {{0,1},//代表右
				{1,0},//代表下
				{0,-1},//代表左
				{-1,0}//代表上
	    };

		//判断是不是到达出门的位置
		if (startx == endx && starty == endy) {
			//更新路线的值
			if (step < min) {
				min = step;
			}
			return ;
		}

		//试探4个方向的走法
		for (int i = 0;i<=3; i++) {
			//计算下一个点的坐标的值
			int tx = startx+next[i][0];
			int ty = starty+next[i][1];

			//判断是不是越界
			if (tx < 1|| tx > row || ty<1||ty>col) {
				continue;
			}

			if (a[tx][ty] == 0 && book[tx][ty] == 0) {
				book[tx][ty] = 1;
				dfs(tx,ty,step+1);
				book[tx][ty] = 0;
			}

		}

		return;

	}

}

    首先我们要写这个算法的时候,首先要知道,在迷宫中我需要知道那些属性,比如我需要知道方向,方向用什么表示,在这里我们是用一个二维数组表示

int next[][] = {(0,1),(1,0),(-1,0),(0,-1)}

      如果大家看不懂的话可以画图。比如

      1,2

    2,1 2,2  2,3

3,2

  看出来了把2,2是如何变成1,2的是不是横坐标的值减少1是不是对应着(-1,0)代表向上。

  还有一点这个算法其实跟我们之前讲解的算法框架是一样的都是,递归求解,找到一个结束的条件,和递归的条件

   算法框架:

      void dfs () {

        if(判断是不是结束的条件){

          XXXX;

XXX;

return ;//这个不要忘记了

        }else {

//条件(比如标记啊什么的)

dfs();

//条件(恢复设置啊什么的);

}

      }

是不是瞬间感觉清楚了很多!!

时间: 2024-08-09 21:55:17

万能的搜索3的相关文章

【万能的搜索,用广搜来解决DP问题】ZZNU -2046 : 生化危机 / HDU 1260:Tickets

2046 : 生化危机 时间限制:1 Sec内存限制:128 MiB提交:19答案正确:8 题目描述 当致命的T病毒从Umbrella Corporation 逃出的时候,地球上大部分的人都死去了. 麻烦的是,他们并没有真正的死去. 爱丽诗在一个狭窄的巷子中,遇见了n个丧尸(编号1-n),巷子太窄了,爱丽诗只能按顺序解决它们. 爱丽诗擅长用匕首和弓箭,当爱丽诗面临编号为i的丧尸时,匕首每次只能解决一个丧尸用时为a[i],弓箭每次能且只能解决两个相邻的丧尸(丧尸i,和丧尸i+1),用时为b[i].

第四章、万能的搜索

第一节.深度优先搜索p78 输出全排列的 dfs 方法 #include <stdio.h> int a[10],book[10],n; void dfs(int step) { int i; if(step==n+1) { for(i=1;i<=n;i++) printf("%d",a[i]); printf("\n"); return; } for(i=1;i<=n;i++) { if(book[i]==0) { a[step]=i; b

万能的搜索--之BFS(三)

接着(一)start (二)广度优先搜索(BFS) 广度优先搜索(又称宽度优先搜索算法)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.   Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止. 广搜的核心思想就是:从初始结点开始,产生第一层节点,检查目标结点是否在这些后继结点之中,

万能的搜索--之简介(一)

* 搜索可能是在 NOIP 中使用范围最广的算法,大部分的题目,在想不到正解的情况下,总能写个搜索(我们称之为的暴力)来得到部分的分数. * 搜索,严格说不上是一个算法,是一种编程的思路:通过穷举所有的可能性,我们模拟问题的处理步骤,直到找到问题的解.* 穷举所有的可能性就注定了时间和空间花销肯定会很大,所以一般只有在数据范围较小的时候能使用搜索算法.* 搜索算法主要分为两类:1 DFS(深度优先搜索):2 BFS(宽度优先搜索). 1. 2. 常见的几类搜索问题: 排列问题枚举1~n的排列组合

万能的搜索--之补充(四)

(三)迭代加深搜索 目的: 解决宽度优先的空间问题和深度优先不能找到最优解的问题.思想: 首先给DFS一个比较小的深度限制,然后逐渐增加深度限制,直到找到解或找遍所以分支为止. (四)启发式搜索 利用知识来引导搜索,达到减少搜索范围,降低问题复杂度的目的.启发信息的强度强:降低搜索工作量,但可能导致找不到最优解弱:一般导致工作量加大,极限情况下变为盲目搜索,但可能可以找到最优解 SO要合理地引入启发知识,在保证找到最佳解的情况下,尽可能减少搜索范围,提高搜索效率. 定义一个评价函数f,对当前的搜

《啊哈!算法》.啊哈磊.扫描版pdf

下载地址:网盘下载 内容简介  · · · · · · 这不过是一本有趣的算法书而已.和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它. 这是一本充满智慧和趣味的算法入门书.没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点, 通过幽默的语言配以可爱的插图来讲解算法.你更像是在阅读一个个轻松的小故事或是在玩一把趣味解谜 游戏,在轻松愉悦中便掌握算法精髓,感受算法之美. 本书中涉及到的数据结构有栈.队列.链表.树.并查集.堆和图等:涉及到的算法有排序.枚举. 深度和广度优先搜索.

各大磁力种子搜索引擎对比

现在磁力种子搜索引擎质量参差不齐,现在就重点整理几个常用的种子搜索站,做个对比分析 1.屌丝搜-最懂屌丝的BT搜索引擎(www.diaosisou.com) 号称最懂屌丝的BT搜索引擎,确实名副其实,屌丝搜索功能强大.其种子资源强大丰富而又有简介的界面风格,无广告弹窗,支持在线云点播,总体来说,屌丝搜确实是良心站点.该磁力站在短时间内获得了极高的人气,在国内有着良好的口碑,被称为种子搜索神器网页版和万能种子搜索器.除了能搜索种子电影资源外,该站点也整合了网盘搜索功能,是一个很大的亮点.推荐指数5

Android Studio 的 10 个你很有可能不知道的技巧

本文首发:http://prototypez.github.io/2016/04/19/about-10-things-you-probably-didn-t-know-you-could-do-in-android-studio/ 转载请注明出处 Android Studio 是每一个 Android 开发每天都要使用的工具,但是即使你是一个经验丰富的开发人员,你也可能已经错过了许多可以节约生命的技巧,这篇文章也许就可以帮助你掌握它们其中的一部分.我不会一字一句地翻译,而是以最简洁易懂的方式介

Android Studio 开发技巧详解

Android Studio开发工具是每一个 Android 程序猿每天都要使用的工具,但是即使你是一个经验丰富的开发人员,你也可能已经错过了许多可以节约生命的技巧,这篇文章也许就可以帮助你掌握它们其中的一部分.我不会一字一句地翻译,而是以最简洁易懂的方式介绍给你,同时提供必要的注解和延伸,让你可以在一遍快速阅读之后迅速掌握. 1.当你想不起来某个功能怎么用的时候 如果你是 Windows/Linux 用户, 那么请按Ctrl + Shift + A, 如果你是 Mac 用户,那么请按Comma