题目:
如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。
输入:
第一行为一个数n,表示迷宫大小
第二行为4个数,表示起点和终点
第三起为n*n的矩阵,0表示通路,1表示墙。
输出:
第一行为路径(见样例)
第二行为总的步数
样例输入:
12
2 9 11 8
1 1 1 1 1 1 1 1 1 1 1 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
样例输出:
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
思路:
bfs模板题,只要有路就搜下去撞到墙走回来继续搜,直到搜完为止。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 25;
const int dx[5]={0,0,-1,0,1};
const int dy[5]={0,-1,0,1,0};
int a[N][N];
int fa[N*N];
int st[N*N][3];
int px,py,qx,qy,n,last,s=0;
void init()
{
scanf("%d",&n);
scanf("%d%d%d%d",&px,&py,&qx,&qy);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
bool check(int x,int y)//边界
{
if(x>0&&x<=n&&y>0&&y<=n)
if (a[x][y]==0) return 1;
return 0;
}
void print(int x)//输出
{
if (x==0) return;
s++;
print(fa[x]);
if (x!=last)
printf("(%d,%d)->",st[x][1],st[x][2]);
else
printf("(%d,%d)\n",st[x][1],st[x][2]);
}
void bfs() {//基本bfs
int head=0,tail=1;
st[1][1]=px; st[1][2]=py;
fa[1]=0;
do {
head++;
for(int k=1;k<=4;k++) {//前后左右
if(check(st[head][1]+dx[k],st[head][2]+dy[k])) {//判断越界
tail++;
fa[tail]=head;
st[tail][1]=st[head][1]+dx[k];//搜
st[tail][2]=st[head][2]+dy[k];
a[st[tail][1]][st[tail][2]]=1;
if(st[tail][1]==qx && st[tail][2]==qy) {
last=tail;
print(tail);
cout<<s<<endl;
tail=0;
return ;
}
}
}
}while(head<tail);
}
int main()
{
init();//调用
bfs();//调用
return 0;
}