

5 6 ###### #....# .E...# ..S.## .##### 5 6 ###### #....# .....# SEK.## .##### 5 6 ###### #....# ....K# SEK.## .##### 5 6 ###### #....# D...E# S...L# .#####
3 2 7 -1
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define ls 2*i
#define rs 2*i+1
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 205
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define rank rank1
const int mod = 10007;
struct node
{
int x,y,step,key;
};
int n,m,sx,sy,knum,kk[N][N];
char g[N][N];
bool vis[N][N][4][1<<7];
bool used[N][N][1<<7];
int to[4][2]= {1,0,0,1,-1,0,0,-1};
int check(int x,int y)
{
if(x<0||y<0||x>=n||y>=m)
return 1;
return 0;
}
int bfs()
{
int i,j;
MEM(vis,0);
MEM(used,0);
queue<node> Q;
node a,next;
a.x = sx;
a.y = sy;
a.step = 0;
a.key = 0;
Q.push(a);
used[a.x][a.y][0] = 1;
while(!Q.empty())
{
a = Q.front();
Q.pop();
for(i = 0; i<4; i++)
{
int mx=to[i][0],my=to[i][1];
int x,y,k,d;
x = a.x,y=a.y,k=a.key;
while(1)
{
if(g[x][y]=='D')
mx=1,my=0;
if(g[x][y]=='R')
mx=-0,my=1;
if(g[x][y]=='U')
mx=-1,my=0;
if(g[x][y]=='L')
mx=0,my=-1;
if(mx==1&&my==0)
d=0;
if(mx==0&&my==1)
d=1;
if(mx==-1&&my==0)
d=2;
if(mx==0&&my==-1)
d=3;
if(vis[x][y][d][k])
break;
vis[x][y][d][k] = 1;
x+=mx,y+=my;
if(check(x,y)) break;
if(g[x][y]=='#') break;
if(g[x][y]=='E'&&k==(1<<knum)-1)
return a.step+1;
if(g[x][y]=='D')
mx=1,my=0;
if(g[x][y]=='R')
mx=-0,my=1;
if(g[x][y]=='U')
mx=-1,my=0;
if(g[x][y]=='L')
mx=0,my=-1;
if(g[x][y]=='K')
k|=kk[x][y];
if(!check(x+mx,y+my)&&g[x+mx][y+my]=='#')
{
if(used[x][y][k])
break;
used[x][y][k] = 1;
next.x = x;
next.y = y;
next.key = k;
next.step=a.step+1;
Q.push(next);
break;
}
}
}
}
return -1;
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
knum = 0;
for(i = 0; i<n; i++)
{
scanf("%s",g[i]);
for(j = 0; j<m; j++)
{
if(g[i][j]=='S')
{
sx=i,sy=j;
}
if(g[i][j]=='K')
{
kk[i][j]=1<<knum;
knum++;
}
}
}
printf("%d\n",bfs());
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/libin56842/article/details/46876137