hdu 1175 连连看

来源:互联网 发布:电信网络诈骗类型 编辑:程序博客网 时间:2024/05/22 05:13

不知道为什么不用flag直接返回bfs的结果会错,被坑了好久。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>using namespace std;struct node{    int x,y,s,d;} t,t0;int n,m,mp[1024][1024],vis[1024][1024];int x,y,x2,y2,flag;int dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0};void bfs(){    queue<node>q;    if(x==x2&&y==y2) return ;    if(mp[x][y]==0||mp[x2][y2]==0) return ;    if(mp[x][y]!=mp[x2][y2]) return ;    memset(vis,5,sizeof(vis));    t.x=x;    t.y=y;    t.s=0;    t.d=-1;    q.push(t);    while(!q.empty())    {        t0=q.front();        //printf("%d %d %d\n",t0.x,t0.y,t0.s);        q.pop();        if(t0.x==x2&&t0.y==y2&&t0.s<=2) {flag=1;return ;}        for(int i=0; i<4; i++)        {            t=t0;            t.x+=dx[i];            t.y+=dy[i];            if(t.x<1||t.x>n||t.y<1||t.y>m) continue;            if(mp[t.x][t.y]==0||(t.x==x2&&t.y==y2))            {                t.d=i;                if(i!=t0.d&&-1!=t0.d) t.s++;                if(t.s>=3) continue;                if(t.s<vis[t.x][t.y])                {                    q.push(t);                    vis[t.x][t.y]=t.s;                }            }        }    }    //return;}int main(){    while(~scanf(" %d %d",&n,&m))    {        if(n==0||m==0) break;        for(int i=1; i<=n; i++)         for(int j=1; j<=m; j++)            scanf("%d",&mp[i][j]);        int T;        scanf("%d",&T);        while(T--)        {            scanf("%d %d %d %d",&x,&y,&x2,&y2);            flag=0;            bfs();            if(flag) printf("YES\n");            else printf("NO\n");        }    }    return 0;}
0 0
原创粉丝点击