HDU1175连连看 BFS

来源:互联网 发布:怎么加盟农村淘宝店 编辑:程序博客网 时间:2024/05/16 19:36

没啥困难的,bfs模板题,注意一下剪枝

#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <climits>#include <string>#include <iostream>#include <cstdlib>#include <list>#include <set>#include <queue>#include <stack>using namespace std;#define maxn 1010int map[maxn][maxn];int vis[maxn][maxn];int n,m;int d[4][2]={0,1,1,0,0,-1,-1,0};struct point{    int x,y;    int num;    int dir;}s,e;bool bfs(){    queue<point>q;    vis[s.x][s.y]=0;    s.num=-1;    s.dir=-1;    q.push(s);    while(!q.empty())    {        point u=q.front();        q.pop();        if(u.x==e.x&&u.y==e.y&&u.num<=2) return 1;        for(int i=0;i<4;i++)        {            point tmp;            tmp.x=u.x+d[i][0];            tmp.y=u.y+d[i][1];            tmp.dir=i;            tmp.num=u.num;            if(tmp.x>=1&&tmp.x<=n&&tmp.y>=1&&tmp.y<=m&&(map[tmp.x][tmp.y]==0||tmp.x==e.x&&tmp.y==e.y))            {                if(tmp.dir!=u.dir)                {                    tmp.num=u.num+1;                    if(tmp.num>2) continue;                    if(vis[tmp.x][tmp.y]>=tmp.num)                    {                        vis[tmp.x][tmp.y]=tmp.num;                        q.push(tmp);                    }                }                else                {                    if(vis[tmp.x][tmp.y]>=tmp.num)                    {                        vis[tmp.x][tmp.y]=tmp.num;                        q.push(tmp);                    }                }            }        }    }    return 0;}int main(){    int t,x1,x2,y1,y2;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0) break;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                scanf("%d",&map[i][j]);            }        }        scanf("%d",&t);        while(t--)        {            for(int i=1;i<=n;i++)            {                for(int j=1;j<=m;j++)                {                    vis[i][j]=4;                }            }            scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);            if(map[s.x][s.y]!=map[e.x][e.y]||map[s.x][s.y]==0||map[e.x][e.y]==0)            printf("NO\n");            else if(bfs()) printf("YES\n");            else printf("NO\n");        }    }    return 0;}


0 0
原创粉丝点击