题目:POJ3984,从左上方起点到右下方终点寻找最短路径并打印
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;//含有路径记录,vis在路径记录中存在作用,故不能简单的设为0,1;
int mp[10][10];
int vis[10][10];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
int x;
int y;
};
queue<node>q;
node end;
void bfs(node s)
{
q.push(s);
int i,j;
while(!q.empty())
{
node cur=q.front();
q.pop();
if(cur.x==end.x&&cur.y==end.y)
{
return ;//搜到终点停止,bfs搜到的即为最短路,故可开始路径寻找;
}
for(i=1;i<=4;i++)//i要从1开始,与下面vis有关;
{
int nowx=cur.x+dir[i-1][0];
int nowy=cur.y+dir[i-1][1];
if(nowx>=0&&nowx<5&&nowy>=0&&nowy<5&&!vis[nowx][nowy])//限制条件,不能出界且没有走过;
{
vis[nowx][nowy]=i;//关键:设为i,而不是变成1,下一步搜寻路径时可以跟方向数组取联合搜出;
node now;
now.x=nowx;
now.y=nowy;
q.push(now);
}
}
}
return ;
}
void findway(int x,int y)//递归往起点搜索,并从起点开始输出;
{
int i,j;
int prex,prey;//连接当前x,y的前一个x,y;
if(vis[x][y]!=-1)
{
prex=x-dir[vis[x][y]-1][0];
prey=y-dir[vis[x][y]-1][1];
findway(prex,prey);
}
printf("(%d, %d)\n",x,y);
}
int main()
{
int i,j;
memset(vis,0,sizeof(vis));//开始时,所有初始化为未走过;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==1)//由于1为墙不能走,故直接标记为1之类的表示走过;
{
vis[i][j]=1;
}
}
}
node s;
s.x=0;
s.y=0;
end.x=4;
end.y=4;
vis[s.x][s.y]=-1;//特殊标记,作为路径寻找结束的标记;
bfs(s);
findway(end.x,end.y);
return 0;
}