码迷,mamicode.com
首页 > 其他好文 > 详细

万能的搜索3

时间:2015-09-22 12:45:15      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

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

  

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();

 

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

                       }

 

      }

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

万能的搜索3

标签:

原文地址:http://www.cnblogs.com/airycode/p/4828504.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!