深度搜索的思路

一个简单小例子:

给定一个起点,终点,以及中途的道路和墙壁

求问,能不能从起点到终点?

s代表起点,g代表终点,.代表道路,#代表墙壁

输入n,m 表示有n行m列

如:

10 10
s.........
#########.
#.......#.
#..####.#.
##....#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
#.#.#.#.#.
#.....#...

思路

//x,y代表起点的坐标
int n, m, x, y;
//输入的地图
char[][] arr;
//判断哪些坐标已经走过
boolean[][] flag;
//用来向右左上下方向前进
int[][] dir = { {0,1},{0,-1},{1,0},{-1,0} };
/**
判断坐标是否在地图中
*/
static boolean in(int x, int y){
    return 0 <= x && x < n && 0 <= y && y <=m;
}
//深度搜索算法,由于起点必定在地图里,所以开始并不需要判断
static boolean dfs(int x, int y){
    if(arr[x][y] == 'g') return true;	//到达终点
    flag[x][y] = true;					//标记
    //很巧妙的方法,看别人写的
    for(int i = 0; i < 4; i++){
        int tx = x + dir[i][0];
        int ty = y + dir[i][1];
        if(in(tx, ty) && arr[tx][ty] != '#' && !flag[tx][ty]){
            //如果这个点是终点,就直接返回
            if(dfs(tx, ty)) return true;
        }
    }
    return false;
}

到此,简单的深度搜索就完成了(就是暴力)

如果要搜索最短路径, 只需该亿点点代码就ok了

int now = 0, min = 0x3f3f3f3f;		//now表示当前路径长度,min表示最短的
//算上起点的距离,不算终点的距离
static void dfs(int x, int y){
    if(arr[x][y] == 'g'){
        min = now < min ? now : min;	//将最小值赋予min
        return;
    }
    flag[x][y] = true;					//标记
    now++;	
    //很巧妙的方法,看别人写的
    for(int i = 0; i < 4; i++){
        int tx = x + dir[i][0];
        int ty = y + dir[i][1];
        if(in(tx, ty) && arr[tx][ty] != '#' && !flag[tx][ty]){
			dfs(tx,ty);		   			//把所有点都逛一遍
        }
    }
    now--;								//返回
    flag[x][y] = false;					//回溯
}

这样就写好了!😉