烂尾之作,思路应该是对的,就是横向和纵向扫描,什么时候想起来再填吧。。。
#include<iostream>
#include<algorithm>
#include <iomanip>
//#include <math.h>
//1175
#define M 1005
#define N 1005
int m,n,q;
int map[M][N];
int x1_,y1_,x2_,y2_;
bool res;
int m_abs(int x)
{
if(x<0){
return 0;
}
}
bool query()
{
if(map[x1_][y1_]!=map[x2_][y2_]){
return false;
}
int f=map[x1_][y1_];
int t;
int n_zl=0,n_zr=0,n_zm=0;
bool b_zl,b_zr,b_zm;
int step;
for(int i=1;i!=m+1;i++){
b_zl=b_zr=b_zm=false;
t=i;
if(t==x1_){
b_zl=true;
}else{
if(t>x1_) { step=1;}else{step=-1;}
for(int k=x1_+step;k!=t+step;k+=step){
if(map[k][y1_]==0||map[k][y1_]==f){
n_zl++;
}
}
if(n_zl==abs(x1_-i)){
b_zl=true;
}
}
t=i;
if(t==x2_){
b_zr=true;
}else{
if(t>x2_) {step=1;}else{step=-1;}
for(int k=x2_+step;k!=t+step;k+=step){
if(map[k][y2_]==0||map[k][y1_]==f){
n_zr++;
}
}
if(n_zr==abs(x2_-i)){
b_zr=true;
}
}
if(y1_==y2_){
b_zm=true;
}else{
if(y1_>y2_){ step=-1;}else{step=1;}
for(int j=y1_+1;j!=y2_;j+=step){
if(map[i][j]==0){
n_zm++;
}
}
if(n_zm==abs(y2_-y1_)-1){
b_zm=true;
}
}
if(b_zl&&b_zr&&b_zm){
return true;
}
n_zl=n_zr=n_zm=0;
}
/*****************************************************/
for(int i=1;i!=n+1;i++){
b_zl=b_zr=b_zm=false;
t=i;
if(t==y1_){
b_zl=true;
}else{
if(t>y1_) { step=1;}else{step=-1;}
for(int k=y1_+step;k!=t+step;k+=step){
if(map[x1_][k]==0||map[k][y1_]==f){
n_zl++;
}
}
if(n_zl==abs(y1_-i)){
b_zl=true;
}
}
t=i;
if(t==y2_){
b_zr=true;
}else{
if(t>y2_) { step=1;}else{step=-1;}
for(int k=y2_+step;k!=t+step;k+=step){
if(map[x2_][k]==0||map[k][y1_]==f){
n_zr++;
}
}
if(n_zr==abs(y2_-i)){
b_zr=true;
}
}
if(x1_==x2_){
b_zm=true;
}else{
if(x1_>x2_){ step=-1;}else{step=1;}
for(int j=x1_;j!=x2_;j+=step){
if(map[i][j]==0){
n_zm++;
}
}
if(n_zm==abs(x2_-x1_)-1){
b_zm=true;
}
}
if(b_zl&&b_zr&&b_zm){
return true;
}
n_zl=n_zr=n_zm=0;
}
return false;
}
int main()
{
while (std::cin>>m>>n){
for(int i=0;i!=m;i++){
for(int j=0;j!=n;j++){
std::cin>>map[i+1][j+1];
}
}
std::cin>>q;
for(int i=0;i!=q;i++){
std::cin>>x1_>>y1_>>x2_>>y2_;
res=query();
if(res){
std::cout<<"YES"<<std::endl;
}else{
std::cout<<"NO"<<std::endl;
}
}
memset(map,0,sizeof(map));
}
}