搜索 dfs+剪枝
题目链接。http://acm.hdu.edu.cn/showproblem.php?pid=1175 HDU 1175 搜索 + 剪枝
//还有4题没有AC,怎么办,今天能写的完吗!然后不是说还要,密码学的后面几章看完,把思考题给解决一下。
//bfs+剪枝:除去转向超过两次的路径,还有关于返回,重制未访问就可以了吗?
//还有突然想起来,苹果好像是有在教怎么使用GPU的,
/*
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
//树要怎么构造,
int n, m,sx, sy, ex, ey,dis[4][2]={-1,0 ,0,1 ,1,0 ,0,-1};
int maze[1002][1002],vis[1002][1002];
bool flag;
void dfs(int x, int y, int dir, int turn){
//转向大于二,已经找到,直接返回
if(turn>2 || flag==true)return;
if(x==ex&&y==ey){
flag=true;
return ;
}
//剪枝
if(turn==2){
if(x!=ex&&y!=ey) return;
else if(x==ex)//上右下左
if(dir!=1)return ;
else if(y==ey)
if(dir!=0)return;
}
int i,xx,yy;
//递归条件
for(i=0; i<4; i++){
xx=x+dis[i][0];
yy=y+dis[i][1];
if(xx<1 || yy<1 || xx>n || yy>m || vis[xx][yy]==1)continue;
if(maze[xx][yy]==0 || (xx==ex&&yy==ey)){
vis[xx][yy]=1;
if(dir==-1) dfs(xx,yy,i%2,turn);
else if(dir==0){
if(i%2==1)dfs(xx,yy,1,turn+1);
else dfs(xx,yy,0,turn);
}
else if(dir==1){
if(i%2==0)dfs(xx,yy,0,turn+1);
else dfs(xx,yy,1,turn);
}
vis[xx][yy]=0;
}
}
}
int main(){
while(scanf("%d%d",&n,&m)==2&&n){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&maze[i][j]);
}
int incnt;scanf("%d",&incnt);
for(int i=1; i<=incnt; i++)
{
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(maze[sx][sy]!=maze[ex][ey]||maze[sx][sy]==0||(sx==ex&&sy==ey)){
printf("NO\n"); continue;
}
memset(vis,0,sizeof(vis));
flag=false;
dfs(sx, sy, -1, 0);
printf("%s\n",flag ? "YES":"NO");
}
}
return 0;
}