//在昨天的写了一个搜索图的基础上继续我的搜索之路...写了一天终于搞出来了..技术见长啊.
//这个题目WA两次.第一次基本上没有剪枝.直接全部深搜.TLE了...
//后来用了一个剪枝.就是对于已经找到过的点.如果拐弯的数目不能进行减小操作.则return ;
//这样做了以后在没取等号的情况下.WA了..后来把等号加上就AC了..暂时还没明白是怎么回事.
//还有一点就是..这里的图是从1 1 开始的.和以前的不一样.同时X Y 坐标表示也要注意.是和以前做的相反的
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
const int inf = 0x3f3f3f;
using namespace std;
int ans[105][105],row,col,arrx,arry,begx,begy,times,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},test;
char map[102][102];
bool vis;
bool judge(int x ,int y,int turn)//判断是否超过限制的函数.
{
if(x >= 0 && x < row && y >= 0 && y < col && turn <= times)
return true ;
return false ;
}
void dfs(int x , int y , int direx , int direy , int turn)
{
if(judge(x,y,turn))
{
if(ans[x][y] >= turn)//这里就是WA的原因..取等号以后就可以AC了.开的ans[][]数组用来记录到达这个点所需要的拐弯次数.
ans[x][y] = turn; //如果已经访问且本次拐弯次数比储存的最小拐弯次数要大.返回..属于这个DFS里面的剪枝
{
vis = 1 ;
}
if(vis)return ;
for(int i = 0 ; i < 4 ; i++)
{
int a = x + dir[i][0] , b = y + dir[i][1],m;
if(map[a][b] == '.')
{
m = turn ;
if(dir[i][0] != direx || dir[i][1] != direy)//如果本次走向与上一次走向不同..拐弯次数+1
m++;
map[x][y] = '*';
dfs(a,b,dir[i][0],dir[i][1],m);
map[x][y] = '.';
}
}
}
}
int main()
{
while(scanf("%d",&test) != EOF)
{
while(test--)
{
vis = 0;
scanf("%d%d",&row,&col);
for(int i = 0 ; i < row ; i++)
scanf("%s",map[i]);
for(int i = 0 ; i < row ; i++)
{
for(int j = 0 ; j < col ; j++)
ans[i][j] = inf ;
}
scanf("%d%d%d%d%d",×,&begy,&begx,&arry,&arrx);
begy--;begx--;arry--;arrx--;//这里为了输入方便.把 1-row 1-col的图变化了一下.仍然为0->row-1 0->col-1的图.
dfs(begx,begy,0,0,-1);//把起止坐标分别-1即可
if(vis == 1)printf("yes\n");
else printf("no\n");
//printf("%d\n",ll);
}
}
}
//这个题目WA两次.第一次基本上没有剪枝.直接全部深搜.TLE了...
//后来用了一个剪枝.就是对于已经找到过的点.如果拐弯的数目不能进行减小操作.则return ;
//这样做了以后在没取等号的情况下.WA了..后来把等号加上就AC了..暂时还没明白是怎么回事.
//还有一点就是..这里的图是从1 1 开始的.和以前的不一样.同时X Y 坐标表示也要注意.是和以前做的相反的
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
const int inf = 0x3f3f3f;
using namespace std;
int ans[105][105],row,col,arrx,arry,begx,begy,times,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},test;
char map[102][102];
bool vis;
bool judge(int x ,int y,int turn)//判断是否超过限制的函数.
{
if(x >= 0 && x < row && y >= 0 && y < col && turn <= times)
return true ;
return false ;
}
void dfs(int x , int y , int direx , int direy , int turn)
{
if(judge(x,y,turn))
{
if(ans[x][y] >= turn)//这里就是WA的原因..取等号以后就可以AC了.开的ans[][]数组用来记录到达这个点所需要的拐弯次数.
ans[x][y] = turn; //如果已经访问且本次拐弯次数比储存的最小拐弯次数要大.返回..属于这个DFS里面的剪枝
else return ; //学长说感觉应该是其他地方应该做相应的调整没有做.才会导致这样.不是因为"="本身的原因
//找到原因了. 例如:(1,0)为终点,(1,1)为当前点,(0,1)先到当前点,《mturn[0][1]==1》--->mturn[1][1]=1,然后(1,2)到达当前点《mturn[1][2]==1》。如果从(1,2)到终点turn为1,如果从(0,1)到则为2。
if(x == arrx && y == arry)//找到该点.返回.{
vis = 1 ;
}
if(vis)return ;
for(int i = 0 ; i < 4 ; i++)
{
int a = x + dir[i][0] , b = y + dir[i][1],m;
if(map[a][b] == '.')
{
m = turn ;
if(dir[i][0] != direx || dir[i][1] != direy)//如果本次走向与上一次走向不同..拐弯次数+1
m++;
map[x][y] = '*';
dfs(a,b,dir[i][0],dir[i][1],m);
map[x][y] = '.';
}
}
}
}
int main()
{
while(scanf("%d",&test) != EOF)
{
while(test--)
{
vis = 0;
scanf("%d%d",&row,&col);
for(int i = 0 ; i < row ; i++)
scanf("%s",map[i]);
for(int i = 0 ; i < row ; i++)
{
for(int j = 0 ; j < col ; j++)
ans[i][j] = inf ;
}
scanf("%d%d%d%d%d",×,&begy,&begx,&arry,&arrx);
begy--;begx--;arry--;arrx--;//这里为了输入方便.把 1-row 1-col的图变化了一下.仍然为0->row-1 0->col-1的图.
dfs(begx,begy,0,0,-1);//把起止坐标分别-1即可
if(vis == 1)printf("yes\n");
else printf("no\n");
//printf("%d\n",ll);
}
}
}