给m*n的矩阵,其中'.'表示可以行走,'*'表示墙壁无法通过,S表示起点,T为终点。
输入m,n,以及符号矩阵,计算S到T的最短步数。
示例输入,
5 5
. . . . .
. * . * .
. * S * .
. * * * .
. . . T *
2 2 4 3
输出: 11
以下为代码。
const int mazeMaxSize = 100;
//迷宫大小
struct Maze{
int m,n;
}mz;
//迷宫坐标点
char maze[mazeMaxSize][mazeMaxSize];
struct mNode{
int x,y;
int step;
}S,T,mnode;
bool flag[mazeMaxSize][mazeMaxSize] = {false};
//增量数组
int mx[4] = {0,0,-1,1};
int my[4] = {1,-1,0,0};
//判断点是否合法
bool islegal(int x,int y){
if(x<0||y<0||x>=mz.m||y>=mz.n) return false;//越界
if(flag[x][y] == true||maze[x][y] == '*') return false;//墙壁或者入过队
return true;
}
//BFS
int BFSmaze(){
queue<mNode> Q;
Q.push(S);
while(!Q.empty()){
mNode top = Q.front();
Q.pop();
//若点x,y为终点,返回步数
if(top.x == T.x&&top.y == T.y) return top.step;
//遍历四周的点
for(int i = 0;i<4;i++){
int newx = top.x + mx[i];
int newy = top.y + my[i];
//合法点记录步数并入队,flag标记
if(islegal(newx,newy)){
mnode.x = newx;
mnode.y = newy;
mnode.step = top.step + 1;
Q.push(mnode);
flag[newx][newy] = true;
}
}
}
return -1;
}
void handle_maze(){
printf("plz input the maze size:\n");
scanf("%d%d",&mz.m,&mz.n);
for(int i = 0;i<mz.m;i++){
getchar();
for(int j = 0;j<mz.n;j++){
maze[i][j] = getchar();
}
maze[i][mz.n] = '\0';
}
scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
S.step = 0;
printf("%d",BFSmaze());
}
//提醒:入队操作是对原变量的副本进行入队
//修改原变量不对入队变量产生影响
int main(){
handle_maze();
return 0;
}