您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页连连看 (BFS)

连连看 (BFS)

来源:华佗小知识

难点在于判断转弯小于两次  这个还好

主要是   走过的路还能再走 但是去掉标记数组会超时

*******所以用     v.step<=f[v.x][v.y]即可!!!  这个思想非常重用!!

 

 

 

 

 查了我一个小时的错误终于找出来了!!!!!!!  !!!!!

判断条件需谨慎QAQ

 

时隔一个月重做一遍 

当初的代码真是歪歪扭扭  现在看来好尴尬。。。

其实这题不用采用这种转向次数vis就可以过的  后面貌似有一题必须要改变

 

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 1000+5
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int sx,sy,ex,ey;
int n,m;
int mp[N][N];
int vis[N][N];

bool inmap(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m;
}

struct node
{
    int x,y;
    int chance;int dic;
    node(int x,int y,int chance,int dic):x(x),y(y),chance(chance),dic(dic){}
};

void bfs()
{
   queue<node>q;
   node u(sx,sy,2,-1);
   q.push(u);
   memset(vis,0,sizeof vis);
   while(!q.empty())
   {
       node u=q.front();q.pop();
       if(u.x==ex&&u.y==ey){printf("YES\n");return ;}

       for(int i=0;i<4;i++)
       {
           node v=u;
           v.x+=dx[i];
           v.y+=dy[i];
        if(inmap(v.x,v.y)&&!vis[v.x][v.y]&&(mp[v.x][v.y]==0||(v.x==ex&&v.y==ey) ) )//这里要是改成mp[v.x][v.y]==mp[ex][ey]会错
        {
           if(v.dic==-1)v.dic=i;
           else if(v.dic!=i)
              {
                  v.dic=i;v.chance--;
              }
            if(v.chance<0)continue;
           q.push(v);
           vis[v.x][v.y]=1;
        }
       }
   }
   printf("NO\n");
}

int main()
{
    while(scanf("%d%d",&n,&m),(n+m))
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&mp[i][j]);
        int q;cin>>q;
        while(q--)
        {
            scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
            if(mp[sx][sy]!=mp[ex][ey] ||mp[sx][sy]==0  )
                printf("NO\n");
            else
            bfs();
        }
    }
}

 

转载于:https://www.cnblogs.com/bxd123/p/10304600.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务