Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

HDOJ/HDU 1728 逃离迷宫 DFS 深度优先搜素

$
0
0

题目链接: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 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>