初开始用深搜提交后超时,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char mass[110][110]; //1728
int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int k, x1, y1, x2, y2;
bool iscan;
void dfs(int t,int x,int y,int pos) //x,y为当前所在的坐标,i为方向的下标,t为已经拐了几次弯
{
for(int i=pos;!iscan;i++)
{
mass[x][y]='*';
if(mass[x+move[i%4][0]][y+move[i%4][1]]!='*')
{
if(i!=pos) t++;
if(t>k) return ;
x=x+move[i%4][0];
y=y+move[i%4][1];
if(x==x2&&y==y2){iscan=true;printf("yes\n");return;}
dfs(t,x,y,i%4);
mass[x][y]='.';
x=x-move[i%4][0];
y=y-move[i%4][1];
mass[x][y]='.';
}
else if(i-pos==4)
{
break;
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m,n,i;
iscan=false;
for(int i=0;i<110;i++) memset(mass[i],'*',110);
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf(" %c",&mass[i][j]);
scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
int pos;
for(i=0;i<4;i++)
if(mass[x1+move[i%4][0]][y1+move[i%4][1]]!='*')
{pos=i;break;}
dfs(0,x1,y1,pos);
if(iscan==false) printf("no\n");
}
return 0;
}
之后想到一个用深搜+广搜的好方法,即把初始点的四个方向上的最少拐弯次数都设为0(前提把每个坐标的最少拐弯次数设为比k大的数),把这些坐标插入到队列中,然后根据队列中的元素再遍历其他坐标,找出每个坐标的最少拐弯次数,然后递归知道找到终点为止