题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175
使用强剪枝,可以减少时间,比较
#include<stdio.h>
#pragma comment(linker,"/STACK:102400000,102400000")
int map[1010][1010];
int n,m,a,b,flag;
void mapbu(int n,int m) //调用输入 map
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&map[i][j]);
}
void dfs(int x,int y,int f,int co) //使用f(0,1,2,3)标记方向,方向改变co++;直到找到x==a,y==b;
{
if(flag||co>2) return;
if(x<0||x>=n||y<0||y>=m) return;
if(x==a&&y==b) {flag=1;return;}
if(map[x][y]!=0) return;
if(co==2&&(a-x)&&(b-y)) return; //强剪枝,最大拐弯但目标不在一条线上,return
map[x][y]=1; //标记走过的
dfs(x-1,y,0,co+(f==0?0:1));
dfs(x,y-1,1,co+(f==1?0:1));
dfs(x+1,y,2,co+(f==2?0:1));
dfs(x,y+1,3,co+(f==3?0:1));
map[x][y]=0;// 重新开始,返回来是,回到初始状态
}
int main()
{
int x1,x2,y1,y2,q;
while(scanf("%d%d",&n,&m),n||m)
{
mapbu(n,m);
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
flag=0;
x1=x1-1;y1=y1-1;a=x2-1;b=y2-1;
if(map[x1][y1]!=map[a][b]) {printf("NO\n"); continue;}
else if(map[x1][y1]==0) {printf("NO\n"); continue;}
else
{
dfs(x1-1,y1,0,0);
dfs(x1,y1-1,1,0);
dfs(x1+1,y1,2,0);
dfs(x1,y1+1,3,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
}
}
return 0;
}