HDOJ1175 连连看

来源:互联网 发布:天猫数据在线直播 编辑:程序博客网 时间:2024/05/24 05:11
#include <iostream>#include <fstream>#include <stdlib.h>#include <string.h>#include <stdio.h>using namespace std;int q,x1,y1,x2,y2,m,n;const int N=1001;int a[N][N];bool line(int x1,int y1,int x2,int y2)//无拐角检测{    int s,e;    bool temp;    if(x1==x2)    {        s=y1<y2?y1:y2;        e=y1>y2?y1:y2;        temp=true;        for(int i=s+1;i<=e-1;i++)            if(a[x1][i]!=0)temp=false;        return temp;    }    if(y1==y2)    {        s=x1<x2?x1:x2;        e=x1>x2?x1:x2;        temp=true;        for(int i=s+1;i<=e-1;i++)            if(a[i][y1]!=0)temp=false;        return temp;    }    return false;}bool check2(int x1,int y1,int x2,int y2)//一个折点检测{    if(x1!=x2 && y1!=y2)//只有一个拐点时,两点肯定不能同行同列    {        if(a[x2][y1]==0)        {            if(line(x1,y1,x2,y1)&&line(x2,y2,x2,y1))            {                    return true;            }        }        if(a[x1][y2]==0)        {            if(line(x1,y1,x1,y2)&&line(x2,y2,x1,y2))<span style="white-space:pre"></span>    {                return true;<span style="white-space:pre"></span>    }        }        return false;    }    return false;}int ok(int x1,int y1,int x2,int y2){    if (x1==x2 && y1==y2) return 0;          //is right     if (a[x1][y1]==0 || a[x2][y2]==0) return 0;    if (a[x1][y1]!=a[x2][y2]) return 0;    if(line(x1,y1,x2,y2))return 1;//无拐点检测    if(check2(x1,y1,x2,y2))return 1;//一个拐点检测    int px,py;                   //以下四个循环为两个折点检测                                //依次判断与点x1,y1能直线连接的点能否与x2,y2构成一个折点连接    for(px=x1-1,py=y1;px>0;--px)//如果这个点不符合上述条件,判断上面的点 //go up    {        if(a[px][py]==0)        {            if(check2(px,py,x2,y2))            return 1;        }        else {            break;             }    }    for(px=x1+1,py=y1;px<m;++px)//go down    {        if(a[px][py]==0)        {            if(check2(px,py,x2,y2))return 1;        }        else {            break;             }    }    for(px=x1,py=y1-1;py>0;--py)//go left    {        if(a[px][py]==0)        {            if(check2(px,py,x2,y2))return 1;        }        else {            break;             }    }    for(px=x1,py=y1+1;py<n;++py)//go right    {        if(a[px][py]==0)        {            if(check2(px,py,x2,y2))return 1;        }        else {            break;             }    }    return 0;       }int main(){    while (scanf("%d%d",&m,&n)!=EOF)    {         if (0==m && 0==n) break;         for (int i=1;i<=m;i++)//get              for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);         scanf("%d",&q);         while (q--)         {            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);            if ( ok(x1,y1,x2,y2) ) printf("YES\n");             else printf("NO\n");         }    }return 0;}


0 0