深搜思路:記錄4個方向和拐彎次數,若拐彎3次,則必須是當前點和終點在一條直線才滿足要求,否則剪掉,這樣也超時,坑爹,之前連連看那個題就是用這種方法也能過,不知道這次為啥過不了,下次再優化。
代碼:
[cpp]
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <fstream>
using namespace std;
int m,n,k,sx,sy,endx,endy;
int dir[4][2]={-1,0,1,0,0,1,0,-1};
char maze[101][101];
bool visit[101][101];
bool flag;
void dfs(int x,int y,int dir,int turn){
// cout<<"x: "<<x<<" y: "<<y<<endl;
if( x<=0||x>m||y<=0||y>n || maze[x][y]=='*')return ;
if(x==endx&&y==endy&&turn<=k){
flag=1;
return ;
}
if(flag)return ;
if(turn>k)return ;
if(turn==k) //剪枝,此時拐彎已經k次,若沒在一條直線上則剪掉
{
if(!(dir==1&&x>endx&&y==endy || dir==2&&x<endx&&y==endy || dir==3&&x==endx&&y>endy || dir==4&&x==endx&&y<endy))
return ;
}
if(visit[x][y])return ;
visit[x][y]=1;
if(dir==1){ //往上走,用dir==1表示,此時三種情況,1:繼續往上走,不拐
//2:往右走,拐一次,3:往左走,拐一次。以下類似。
dfs(x-1,y,1,turn);
dfs(x,y-1,3,turn+1);
dfs(x,y+1,4,turn+1);
}
else if(dir==2){
dfs(x+1,y,2,turn);
dfs(x,y-1,3,turn+1);
dfs(x,y+1,4,turn+1);
}
else if(dir==3){
dfs(x-1,y,1,turn+1);
dfs(x+1,y,2,turn+1);
dfs(x,y-1,3,turn);
}
else if(dir==4){
dfs(x-1,y,1,turn+1);
dfs(x+1,y,2,turn+1);
dfs(x,y+1,4,turn);
}
visit[x][y]=0;
}
int main()
{
int t;
// ifstream fin;
//fin.open("abc.txt");
//cout<<fin.is_open()<<endl;
scanf("%d",&t);
// cin>>t;
while(t--)
{
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>maze[i][j];
}
}
scanf("%d %d %d %d %d",&k,&sy,&sx,&endy,&endx);
if(sx==endx&&sy==endy){
cout<<"yes"<<endl;
continue;
}
memset(visit,0,sizeof(visit));
flag=0;
visit[sx][sy]=1;
dfs(sx-1,sy,1,0); //go up,dir==1
dfs(sx+1,sy,2,0); //go down ,dir==2
dfs(sx,sy-1,3,0); //go left,dir==3
dfs(sx,sy+1,4,0); //go right,dir==4
if(flag)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}