hdu 1175 连连看

点击打开链接

与1728类似,但写出来后一直超时。。。

最后把数组改为1001(原来为1024),就AC了。。


#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int map[1001][1001];
int v[1001][1001];
int n,m,t,ex,ey,sx,sy;
struct node
{
    int x,y,step;
};
bool judge(int x,int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=m&&
        (map[x][y]==0||(x==ex&&y==ey)))
        return 1;
    return 0;
}
void bfs()
{
    memset(v,0,sizeof(v));
    queue<node>Q;
    int i,xx,yy;
    node s,e;
    s.x=sx;
    s.y=sy;
    s.step=-1;
    v[s.x][s.y]=1;
    Q.push(s);
    while(!Q.empty())
    {
        s=Q.front();
        Q.pop();
        for(i=0;i<4;i++)
        {
            xx=s.x+dir[i][0];
            yy=s.y+dir[i][1];
            while(judge(xx,yy))
            {
                if(v[xx][yy]==0)
                {
                    v[xx][yy]=1;
                    e.x=xx;
                    e.y=yy;
                    e.step=s.step+1;
                    Q.push(e);
                    if(e.x==ex&&e.y==ey&&e.step<=2)
                    {
                        printf("YES\n");
                        return ;
                    }
                }
                xx+=dir[i][0];
                yy+=dir[i][1];
            }
        }
    }
    printf("NO\n");
    return ;
}
int main()
{
    int i,j;
    while(scanf("%d%d",&n,&m),n+m)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                scanf("%d",&map[i][j]);
            scanf("%d",&t);
            while(t--)
            {
                scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
                if((sx==ex&&sy==ey)||map[sx][sy]==0
                    ||map[ex][ey]==0||map[sx][sy]!=map[ex][ey])
                    printf("NO\n");
                else
                    bfs();
            }
    }
    return 0;
}


原文地址:https://www.cnblogs.com/yyf573462811/p/6365399.html