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

【ACM】连连看 hdu1175

时间:2015-02-13 23:33:07      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

#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))
{
                return true;
}
        }
        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)//如果这个点不符合上述条件,判断上面的点 //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)//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)//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)//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;
}

  

【ACM】连连看 hdu1175

标签:

原文地址:http://www.cnblogs.com/bruce27/p/4290970.html

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