(搜索)2753:走迷宫

描述

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

输入

第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用'.'表示,有障碍物的格子用'#'表示。
迷宫左上角和右下角都是'.'。

输出

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

样例输入

5 5

..###

#....

#.#.#

#.#.#

#.#..

样例输出

9

我の思考

这个题目,假如你在一个方块上,你有四种走法,上,下,左,右分别走,

设置一个走过的数组,来标记方块是否被经历过,用递归的方法,可以走完。

我の代码

#include <iostream>
#include <string.h>
using namespace std;
char sym[101][41];
bool visited[101][41];
int num=9999;
int width,height;
int flag=0;


void cal(int i,int j,int t){

    if(visited[i][j]==1 || sym[i][j]=='#' || i>height-1 || j>width-1 || i<0 || j<0)
        return;
    visited[i][j]=1;
if(i==height-1&&j==width-1){
        flag=1;
        if(num > t) {
            num = t;
        }
        t=0;
        return;
    }

    cal(i,j+1,t+1);
    cal(i+1,j,t+1);
    cal(i,j-1,t+1);
    cal(i-1,j,t+1);
}
int main()
{
    cin>>height>>width;
    memset(visited,0,sizeof(visited));

    for(int i=0;i<height;i++){
        for(int j=0;j<width;j++){
            cin>>sym[i][j];
        }
    }

    cal(0,0,1);
    if(flag==0){
        cout<<"No"<<endl;
    } else {
        cout<<num<<endl;
    }

    return 0;
}
原文地址:https://www.cnblogs.com/rimochiko/p/7537896.html