Double Maze
来源:互联网 发布:java 平均分配算法 编辑:程序博客网 时间:2024/06/05 18:54
Double Maze
Accepted : 32Submit : 57Time Limit : 1000 MSMemory Limit : 65536 KB题目描述
一个迷宫里,有两个点,你的任务是给出 尽可能短 的一系列的命令,让这两个点一起执行这些命令能走到一起。如果某个点按某个命令走会走出迷宫或走到障碍上,则忽略这条命令。
输入
输入不超过1000个样例,每个样例第一行有两个整数n,m(2≤n,m≤11),之后n行每行m个字符,'.'表示能走的地方,'#'表示障碍,‘*'表示其中一个点。每个样例之间有一个空行。
输出
每个样例输出一行,包含'U','D','L','R'。'U'表示向上走的命令,'D'表示向下,'L'表示向左,'R'表示向右。要是有多个答案,输出 字典序最小 的序列。如果无法达到目标,输出“Sorry”(引号不要输出)。
样例输入
4 11*.##..#..#*...#..#.#...##.#.#.##.##..###....4 4.*...###...*....10 10*.........#########............#########..........#########............#########.........*##########
样例输出
SorryLLLUULLLLLLLLLUURRRRRRRRRUULLLLLLLLLUURRRRRRRRRDD#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <set>using namespace std;struct PT{ int x1,y1,x2,y2; string gogogo;};const int dir_x[4]={1,0,0,-1};const int dir_y[4]={0,-1,1,0};const char dir[4]={'D','L','R','U'};char mp[20][20];int n,m;int hash(int a,int b,int c,int d){ int ret=a; ret=ret*100+b; ret=ret*100+c; ret=ret*100+d; return ret;}void ck(int& x1,int& y1,int& x2,int& y2,int d){ if(x1<0||x1>=n||y1<0||y1>=m||mp[x1][y1]=='#') { x1=x1-dir_x[d];y1=y1-dir_y[d]; } if(x2<0||x2>=n||y2<0||y2>=m||mp[x2][y2]=='#') { x2=x2-dir_x[d];y2=y2-dir_y[d]; }}int main(){while(scanf("%d%d",&n,&m)!=EOF){ int a=0,b=0,c=0,d=0; for(int i=0;i<n;i++) scanf("%s",mp[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(mp[i][j]=='*') { if(a==0&&b==0) { a=i;b=j; } else { c=i;d=j; } } } } PT ac=(PT){a,b,c,d,"@"}; queue<PT> q; q.push(ac); set<int> st; st.insert(hash(a,b,c,d)); bool flag=false; string ans; while(!q.empty()) { PT u=q.front(),v; q.pop(); if(flag&&u.gogogo.size()>ans.size()) break; if(u.x1==u.x2&&u.y1==u.y2) { if(ans.size()==0) ans=u.gogogo; else if(ans>u.gogogo) ans=u.gogogo; flag=true; } for(int i=0;i<4;i++) { int X1=u.x1+dir_x[i],X2=u.x2+dir_x[i]; int Y1=u.y1+dir_y[i],Y2=u.y2+dir_y[i]; ck(X1,Y1,X2,Y2,i); string R=u.gogogo+dir[i]; int h=hash(X1,Y1,X2,Y2); if(!st.count(h)) { st.insert(h); v=(PT){X1,Y1,X2,Y2,R}; q.push(v); } } } if(!flag) cout<<"Sorry\n"; else { int n=ans.size(); for(int i=1;i<n;i++) cout<<ans[i]; cout<<endl; }} return 0;}
0 0
- Double Maze
- Double Maze
- Double Maze
- hdu 3713 Double Maze
- HDU 3713 Double Maze
- HDU 3713Double Maze
- HDU 3713 Double Maze(DFS)
- xtuoj 1187 Double Maze (2014XTU校赛)
- ZOJ 3420 Double Maze (BFS)
- HDU-3713:Double Maze(双重BFS)
- hdu 3713 Double Maze(四维的BFS)
- hdoj 3713 Double Maze (四维BFS + 打印路径)
- HDU-3713---Double Maze (bfs) 详细解释
- Maze
- maze
- Maze
- maze
- Maze
- ubuntu下7z文件的解压方法
- nosql数据库总结
- 16进制转化为八进制,字符串(很大的数字)
- java打印文件树的代码
- Python os.path模块
- Double Maze
- 黑马程序员-常用正则表达式
- C# 根据列名与列值设置当前行
- SD总线访问模式
- 经典c程序(0007)---兔子问题(斐波那契数列)
- 查看ORA错误
- link 和 runtime-link,搭配shared 和 static
- 我的项目总结
- Hard Wuxing