您的位置:首页 > 其它

Double Maze

2014-03-16 12:54 120 查看


Double Maze

Accepted : 32Submit : 57
Time 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
*.........
#########.
..........
.#########
..........
#########.
..........
.#########
.........*
##########


样例输出

Sorry
LLLUU
LLLLLLLLLUURRRRRRRRRUULLLLLLLLLUURRRRRRRRRDD#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: