zoukankan      html  css  js  c++  java
  • HDU-1175-连连看

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1175

    普通的bfs,外加判断转角次数,就ko了。

    #include<iostream>

    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
     
    struct node
    {
        int x,y;
        int t,d;
    };
     
    int n,m,map[1002][1002],prove;
    int visit[1002][1002];
    int qry,sx,sy,ex,ey;
    int dx[4]={0,-1,0,1};
    int dy[4]={1,0,-1,0};
     
    queue<node> q;
     
    void bfs()
    {
        while(!q.empty())
        q.pop();
        memset(visit,0,sizeof(visit));
        node s,e;
        s.x=sx;   s.y=sy;
        s.t=0;    s.d=-1;
        q.push(s);
        while(q.size())
        {
            s=q.front();
            q.pop();
            if(s.t>2)
            continue;
            if(s.x==ex&&s.y==ey)
            {
                prove=1;
                printf("YES ");
                break;
            }
            for(int i=0;i<4;i++)
            {
                e.x=s.x+dx[i];    e.y=s.y+dy[i];
                if(e.x<1||e.x>n||e.y<1||e.y>m||visit[e.x][e.y])
                continue;
                if(map[e.x][e.y]==0||(e.x==ex&&e.y==ey))
                {
                    if(s.d==-1||s.d==i)
                    {
                        e.d=i;
                        e.t=s.t;
                        q.push(e);
                        visit[e.x][e.y]=1;
                    }
                    else
                    {
                        e.d=i;
                        e.t=s.t+1;
                        q.push(e);
                        visit[e.x][e.y]=1;
                    }
                }
            }
        }
    }
     
    int main(void)
    {
        while(scanf("%d%d",&n,&m)==2&&(n+m))
        {
            for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&map[i][j]);
            scanf("%d",&qry);
            for(int i=0;i<qry;i++)
            {
                prove=0;
                cin>>sx>>sy>>ex>>ey;
                if(sx==ex&&sy==ey)
                {
                    printf("NO ");
                    continue;
                }
                if(map[sx][sy]==map[ex][ey]&&map[sx][sy]!=0)
                bfs();
                if(!prove)
                printf("NO ");
            }
        }
        return 0;
    }
  • 相关阅读:
    FFmpeg笔记-基本使用
    记一次下载大文件存在数据异常问题排查
    从零开始编写IntelliJ IDEA插件
    Guava LoadingCache不能缓存null值
    FFmpeg笔记--vcodec和-c:v,-acodec和-c:a的区别?
    说说maven依赖冲突,依赖调解,依赖传递和依赖范围
    记一次NoHttpResponseException问题排查
    JVM源码分析-类加载场景实例分析
    JVM源码分析-JVM源码编译与调试
    理解PHP的变量,值与引用的关系
  • 原文地址:https://www.cnblogs.com/liudehao/p/4015941.html
Copyright © 2011-2022 走看看