题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
深搜思路:记录4个方向和拐弯次数,若拐弯3次,则必须是当前点和终点在一条直线才满足要求,否则剪掉,这样也超时,坑爹,之前连连看那个题就是用这种方法也能过,不知道这次为啥过不了,下次再优化。
代码:
#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; }
作者:xiaozhuaixifu 发表于2013-6-6 23:50:58 原文链接
阅读:121 评论:0 查看评论