比赛 |
20150421 |
评测结果 |
AAAAAAAAAA |
题目名称 |
飞越原野 |
最终得分 |
100 |
用户昵称 |
ztx |
运行时间 |
0.438 s |
代码语言 |
C++ |
内存使用 |
8.38 MiB |
提交时间 |
2015-04-21 10:38:48 |
显示代码纯文本
/****************************************\
* Author : ztx
* Title : [cogs] 650. 飞越原野
* ALG : 双向spfa
* CMT :
* Time :
\****************************************/
#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define rep(i,l,r) for(i=(l);i< (r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
#define rev(i,r,l) for(i=(r);i> (l);i--)
typedef long long ll ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
if (CH == '-') NEG = true , CH = getchar() ;
while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
if (NEG) ret = -ret ;
}
template <typename TP>inline void readc(TP& ret) {
while (ret=getchar() , ret<'!') ;
// while (CH=getchar() , CH>'!') ;
}
template <typename TP>inline void reads(TP *ret) {
ret[0]=0;while (CH=getchar() , CH<'!') ;
while (ret[++ret[0]]=CH,CH=getchar(),CH>'!') ;
}
#include <cstring>
#include <deque>
#define maxn 110LL
#define maxk 110LL
#define infi 0x3f3f3f3fLL
#define min(x,y) ((x)<(y)?(x):(y))
const int dx[4] = {0,0,1,-1} ;
const int dy[4] = {1,-1,0,0} ;
int R , C , K , ans ;
bool map[maxn][maxn] ;
int dis[maxn][maxn][maxk] ;
int inq[maxn][maxn][maxk] = {0} ;
std::deque<int>qx;
std::deque<int>qy;
std::deque<int>qk;
inline void PushFront(int x,int y,int k) { qx.push_front(x),qy.push_front(y),qk.push_front(k) ;inq[x][y][k]=true; }
inline void PushBack(int x,int y,int k) { qx.push_back(x),qy.push_back(y),qk.push_back(k) ;inq[x][y][k]=true; }
inline void TakeOutFront(int&x,int&y,int&k) { x=qx.front(),qx.pop_front();y=qy.front(),qy.pop_front();k=qk.front(),qk.pop_front();inq[x][y][k]=false; }
inline bool SLF(int x,int y,int k) { return !qx.empty()&&dis[x][y][k]<dis[qx.front()][qy.front()][qk.front()]; }
inline void spfa() {
int ux,uy,uk,vx,vy,vk,d,len;
memset(dis, 0x3f ,sizeof dis) ;
dis[1][1][0] = 0 ;
PushBack(1,1,0) ;
while (!qx.empty()) {
TakeOutFront(ux,uy,uk) ;
rep (d,0,4) {
vx=ux+dx[d],vy=uy+dy[d];
if (!vx||!vy||vx>R||vy>C) continue ;
if (map[vx][vy] && dis[vx][vy][uk]>dis[ux][uy][uk]+1) {
dis[vx][vy][uk] = dis[ux][uy][uk]+1 ;
if (!inq[vx][vy][uk]) {
if (SLF(vx,vy,uk)) PushFront(vx,vy,uk) ;
else PushBack(vx,vy,uk) ;
}
}
for (vx+=dx[d],vy+=dy[d],len=2;vx&&vy&&vx<=R&&vy<=C;vx+=dx[d],vy+=dy[d],len++) {
if (vk=uk+len,vk>K) break ;
if (!map[vx][vy]) continue ;
if (dis[vx][vy][vk] > dis[ux][uy][uk]+1) {
dis[vx][vy][vk] = dis[ux][uy][uk]+1 ;
if (!inq[vx][vy][vk]) {
if (SLF(vx,vy,vk)) PushFront(vx,vy,vk) ;
else PushBack(vx,vy,vk) ;
}
}
}
}
}
ans = infi ;
Rep (d,0,K) ans = min(ans,dis[R][C][d]) ;
}
int main() {
int i , j , k ;
#define READ
#ifdef READ
freopen("escapea.in" ,"r",stdin ) ;
freopen("escapea.out","w",stdout) ;
#endif
read(R) , read(C) , read(K) ;
Rep (i,1,R) Rep (j,1,C)
readc(k) , map[i][j] = (k=='P') ;
if (!map[1][1] || !map[R][C]) ans=infi ;
else spfa() ;
if (ans == infi) puts("impossible") ;
else printf("%d\n", ans) ;
#ifdef READ
fclose(stdin) ; fclose(stdout) ;
#else
getchar() ; getchar() ;
#endif
return 0 ;
}
/*
4 4 2
PLLP
PPLP
PPPP
PLLP
*/