描述
一个迷宫由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; }