标签:
#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;
}
标签:
原文地址:http://www.cnblogs.com/bruce27/p/4290970.html