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
原创粉丝点击