hdu1175 bfs

来源:互联网 发布:网络十大恐怖歌曲 编辑:程序博客网 时间:2024/06/17 22:35

我的思路是记录拐弯点 还有方向 但是wa了,我觉得大致思路是对的。我先贴出来 最近忙 没有时间改 他们说dfs比较简单 但我还是习惯用bfs做

#include<iostream>

#include<cstdio>
#include<cstring>
#include<string.h>
#include<queue>
using namespace std;
int n,m,q,maze[1010][1010],vis[1010][1010];
int x1,y1,x2,y2,r;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct node
{
    int x;
    int y;
    int k;
    int dir;
};
int bfs(int c,int d)
{node a,b;
queue<node>que;
a.x=c;a.y=d;a.k=0;a.dir=-1;
que.push(a);


while(que.size())
{


    a=que.front();
    que.pop();
    if(a.x==x2&&a.y==y2&&a.k<=2)
    {//cout<<"  ss"<<a.k<<endl;
        return 1;
    }
    for(int i=0;i<4;i++)
    {
        b.x=a.x+dx[i];
        b.y=a.y+dy[i];
        b.dir=a.dir;
        b.k=a.k;
        if(b.dir==-1)
        {
            b.dir=i;
        }
        else if(b.dir!=i)
        {
            b.k=a.k+1;
            b.dir=i;


        }


        if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&maze[b.x][b.y]==0&&vis[b.x][b.y]==0&&b.k<=2)
        {
            vis[b.x][b.y]=1;


    que.push(b);
        }


    }


}
 return -1;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
    {
        for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            scanf("%d",&maze[i][j]);
    }
    scanf("%d",&q);
    for(int i=0;i<q;i++)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        x1=x1-1;x2=x2-1;y1=y1-1;y2=y2-1;
        if(maze[x1][y1]!=maze[x2][y2])
        {cout<<"NO"<<endl;
              continue;
        }


            if(maze[x1][y1]==0||maze[x2][y2]==0)
  {cout<<"NO"<<endl;
              continue;
        }
        if(x1==x2&&y1==y2)
     {cout<<"NO"<<endl;
              continue;
        }


        r=maze[x2][y2];
        maze[x2][y2]=0;




memset(vis,0,sizeof(vis));
       if(bfs(x1,y1)>0)
        {


            cout<<"YES"<<endl;
        }
        else
           {
               cout<<"NO"<<endl;
           }
           maze[x2][y2]=r;




    }




    }
    return 0;
}

0 0
原创粉丝点击