比赛 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
*/