您的位置:首页 > 其它

poj 3170 Knights of Ni (bfs)

2015-07-13 09:48 447 查看
///从2开始先到4再到3的最小步数
///vis开三维判断到4之前和到4之后是否访问过该点
# include <stdio.h>
# include <algorithm>
# include <string.h>
# include <queue>
using namespace std;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
struct node
{
int x;
int y;
int step;
int flag;
};
int n,m;
int a[1010][1010];
int vis[1010][1010][2];
void bfs(int ax,int ay)
{
memset(vis,0,sizeof(vis));
node front,next;
front.x=ax;
front.y=ay;
front.step=0;
front.flag=0;
vis[ax][ay][0]=1;
queue<node>q;
q.push(front);
while(!q.empty())
{
front=q.front();
q.pop();
if(a[front.x][front.y]==3&&front.flag==1)
{
printf("%d\n",front.step);
return ;
}
for(int i=0;i<4;i++)
{
next.x=front.x+xx[i];
next.y=front.y+yy[i];
next.step=front.step+1;
if(a[next.x][next.y]==4||front.flag==1)
next.flag=1;
else
next.flag=0;
if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&a[next.x][next.y]!=1&&!vis[next.x][next.y][next.flag])
{
vis[next.x][next.y][next.flag]=1;
q.push(next);
}
}
}
return ;
}
int main()
{
int i,j,ax,ay;
while(~scanf("%d%d",&m,&n))
{
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==2)
{
ax=i;
ay=j;
}
}
}
bfs(ax,ay);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: