HDOJ/HDU 1728 逃离迷宫 DFS 深度优先搜素
来源:互联网 发布:绝地求生显卡驱动优化 编辑:程序博客网 时间:2024/04/29 01:03
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
深搜思路:记录4个方向和拐弯次数,若拐弯3次,则必须是当前点和终点在一条直线才满足要求,否则剪掉,这样也超时,坑爹,之前连连看那个题就是用这种方法也能过,z这次的数据有点强,100*100了,所以深搜不行,不过这思路倒不错。
代码:
#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==1dfs(sx+1,sy,2,0); //go down ,dir==2dfs(sx,sy-1,3,0); //go left,dir==3dfs(sx,sy+1,4,0); //go right,dir==4if(flag)cout<<"yes"<<endl;else cout<<"no"<<endl;}return 0;}
下面改为广搜了,不过也需要一定的技巧,防止内存超,这题在网上看了解题报告之后tricky是沿着一个方向搜索下去,这样的拐弯次数最少,优先这样的点入队,可以提高不少时间:AC 31MS
转自:http://blog.csdn.net/sdc1992/article/details/8825729
代码:
#include<cstdio>#include<cstring>#include<queue>using namespace std;struct node{ int x,y;}now,tmp;queue<struct node>q;int m,n;char maze[111][111];int vis[111][111];int k,bx,by,ex,ey;int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};bool bfs(){ while(!q.empty()) q.pop(); now.x=bx;now.y=by; q.push(now); while(!q.empty()) { now=q.front(); for(int i=0;i<4;i++) { tmp.x=now.x+dx[i]; tmp.y=now.y+dy[i]; while(tmp.x>0&&tmp.y>0&&tmp.x<=m&&tmp.y<=n&&maze[tmp.x][tmp.y]!='*') { if(vis[tmp.x][tmp.y]==-1) { q.push(tmp); vis[tmp.x][tmp.y]=vis[now.x][now.y]+1; if(tmp.x==ex&&tmp.y==ey) return true; } tmp.x+=dx[i];tmp.y+=dy[i]; } } q.pop(); } return false;}int main(){ int t; while(scanf("%d",&t)==1) { while(t--) { memset(vis,-1,sizeof(vis)); scanf("%d %d",&m,&n); int i; for(i=1;i<=m;i++) scanf("%s",maze[i]+1); scanf("%d %d %d %d %d",&k,&by,&bx,&ey,&ex); if(bx==ex&&by==ey) { printf("yes\n"); continue; } if(bfs()) { if(vis[ex][ey]<=k) printf("yes\n"); else printf("no\n"); } else printf("no\n"); } } return 0;}
- HDOJ/HDU 1728 逃离迷宫 DFS 深度优先搜素
- hdu 1728 逃离迷宫(dFS+优先队列)
- HDOJ 1728 逃离迷宫(DFS)
- HDOJ 1728 逃离迷宫 (DFS)
- hdu 1728 逃离迷宫(DFS)
- HDU 1728逃离迷宫(简单dfs)
- HDU 1728逃离迷宫(DFS或者BFS)
- HDU 1728逃离迷宫(DFS或者BFS)
- 1728 hdu 逃离迷宫(DFS)
- HDU 1728 逃离迷宫(BFS+DFS)
- HDU - 1728 - 逃离迷宫(dfs)
- hdu 1728 逃离迷宫(dfs+剪枝)
- HDU-1728 逃离迷宫(DFS)
- hdu 1728 逃离迷宫(dfs)
- hdu 1728 逃离迷宫 剪枝DFS
- 逃离迷宫 HDU-1728 BFS深度搜索
- HDOJ 1728 逃离迷宫
- Hdoj 1728 逃离迷宫
- ssh 登录出现Are you sure you want to continue connecting (yes/no)?解决方法
- 你的代码写的很臭
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
- 根文件系统的挂载流程分析
- 根文件系统的加载
- HDOJ/HDU 1728 逃离迷宫 DFS 深度优先搜素
- 简单排序算法之快速排序
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
- jprofiler 7.X注册码
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- 变量~HLSL
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- POJ The Fewest Coins
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化