标签:
#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