Description
如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。
Sample Input
12 //迷宫大小
2 9 11 8 //起点和终点
1 1 1 1 1 1 1 1 1 1 1 1 //邻接矩阵,0表示通,1表示不通
1 0 0 0 0 0 0 1 0 1 1 1
1 0 1 0 1 1 0 0 0 0 0 1
1 0 1 0 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 1
1 0 1 0 1 1 1 1 1 1 1 1
1 0 0 0 1 0 1 0 0 0 0 1
1 0 1 1 1 0 0 0 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1 0 1
1 1 1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
Sample Output
(2,9)->(3,9)->(3,8)->(3,7)->(4,7)->(5,7)->(5,6)->(5,5)->(5,4)->(6,4)->(7,4)->(7,3)->(7,2)->(8,2)->(9,2)->(9,3)->(9,4)->(9,5)->(9,6)->(8,6)->(8,7)->(8,8)->(9,8)->(9,9)->(10,9)->(11,9)->(11,8)
27
解题思路
板子广搜
(没有思路,只有注释)
#include<iostream>
#include<cstdio>
using namespace std;
const int w[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
int a[200][200],f[200][200][2],s[200][200];//f用来存父亲的横,竖坐标;a记录走没走过;s记录步数
int v[100100][2],h,t=1;
int n,sx,sy,ex,ey;
bool check(int x,int y){//判断x,y在不在迷宫范围内
return (x>0&&x<=n&&y>0&&y<=n);
}
void bfs(int x,int y){
a[x][y]=s[x][y]=1;//标记第一个点
v[t][0]=x,v[t][1]=y;
while(h++<t){
for(int i=0;i<4;i++){
int xx=v[h][0]+w[i][0],yy=v[h][1]+w[i][1];
if(check(xx,yy)&&!a[xx][yy]){
| a[xx][yy]=1; |
| s[xx][yy]=s[v[h][0]][v[h][1]]+1; |//广搜的维护处理
| v[++t][0]=xx,v[t][1]=yy; |
f[xx][yy][0]=v[h][0],f[xx][yy][1]=v[h][1]; //记录路径
if(xx==ex&&yy==ey)return;//找到直接退出
}
}
}
}
void print(int x,int y){//递归输出路径
if(x!=sx||y!=sy)
print(f[x][y][0],f[x][y][1]);
else{
printf("(%d,%d)",x,y);
return;
}
printf("->(%d,%d)",x,y);
}
int main(){
scanf("%d",&n);
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
bfs(sx,sy);
print(ex,ey);
printf("\n%d",s[ex][ey]);
}