码迷,mamicode.com
首页 > 其他好文 > 详细

连连看

时间:2019-01-22 17:38:11      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:set   ++   gif   name   alt   print   cstring   node   cfa   

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

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

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

 

 

 

 

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

技术分享图片
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;

int world[1005][1005];
int f[1005][1005];
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
int n,m;int sx,sy,ex,ey;


struct node
{
    int x,y,d1,chance;
    node(int x=0,int y=0,int d1=0,int chance=0):x(x),y(y),d1(d1),chance(chance){}

};

void bfs()
{
    memset(f,1,sizeof(f));


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

        for(int i=0;i<4;i++)
        {


            node v(u.x+dx[i],u.y+dy[i],u.d1,u.chance);




            if(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m&&((v.x==ex&&v.y==ey)||world[v.x][v.y]==0))//这里(v.x==ex&&v.y==ey)不能改成与目标内容相同!!!
            {
                if(v.d1!=-1)
                {
                    if(v.d1!=i)
                    {
                        v.chance++;v.d1=i;
                    }

                }
                else v.d1=i;
                if(v.chance>2)continue;
                if(v.chance<=f[v.x][v.y])
                {


             // printf("%d %d %d\n",v.x,v.y,v.chance);
                f[v.x][v.y]=v.chance;
                q.push(v);
                }
            }

        }


    }
    printf("NO\n");




}







int main()
{

    while(cin>>n>>m,(n+m))
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
               scanf("%d",&world[i][j]);

        int Q;scanf("%d",&Q);
        for(int i=1;i<=Q;i++)
        {
            scanf("%d%d%d%d",&sx,&sy,&ex,&ey);


             if(world[sx][sy]!=world[ex][ey]||!world[sx][sy]||!world[ex][ey]||(ex==sx&&sy==ey))
                printf("NO\n");
            else
            bfs();
        }



    }






    return 0;
}
View Code

判断条件需谨慎QAQ

连连看

标签:set   ++   gif   name   alt   print   cstring   node   cfa   

原文地址:https://www.cnblogs.com/bxd123/p/10304600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!