NYOJ-最小步数(bfs)

来源:互联网 发布:手机pdf语音朗读软件 编辑:程序博客网 时间:2024/06/09 02:49

NYOJ-58最小步数

时间限制:3000 ms  |  内存限制:65535 KB难度:4

描述

这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,10表示道路,1表示墙。 现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入

第一行输入一个整数n(0<n<=100),表示有n组测试数据;随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。

输出

输出最少走几步。

样例输入

23 1  5 73 1  6 7

样例输出

1211
#include<iostream>#include<queue>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int maze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,1,                      1,0,0,1,1,0,0,0,1,1,0,1,0,1,1,0,1,1,                      1,0,0,0,0,1,0,0,1,1,1,0,1,0,1,0,0,1,                      1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,1,                      1,1,1,1,1,1,1,1,1};typedef struct node{    int x,y;    int step;}point;int vis[9][9];const int dir[4][2]={1,0,-1,0,0,1,0,-1};int sx,sy,ex,ey;void init(){    memset(vis,0,sizeof(vis));}int bfs(){    queue<point> qu;    point temp={sx,sy,0};    qu.push(temp);    vis[sx][sy]=1;    while(!qu.empty())    {        point v= qu.front();        int x=v.x;int y=v.y;        if(x==ex&&y==ey) return v.step;        vis[x][y]=1;        for(int i=0;i<4;i++)        {            int tx=x+dir[i][0];            int ty=y+dir[i][1];            if(tx<0||tx>8||ty<0||ty>8) continue;            if(!vis[tx][ty]&&!maze[tx][ty])            {                vis[tx][ty]=1;                point to;                to.x=tx;                to.y=ty;                to.step=v.step+1;                qu.push(to);            }        }        qu.pop();    }}int main(){    int t;    cin>>t;    while(t--)    {        init();        cin>>sx>>sy>>ex>>ey;        cout<<bfs()<<endl;    }    return 0;}
原创粉丝点击