比赛 20150421 评测结果 AAAAAAAAWA
题目名称 飞越原野 最终得分 90
用户昵称 new ioer 运行时间 0.747 s
代码语言 C++ 内存使用 10.57 MiB
提交时间 2015-04-21 11:54:55
显示代码纯文本
#include<deque>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,d,ans,f[110][110][110],c[110][110][110];
char map[110][110];
bool vis[110][110][110];
deque <int> q1,q2,q3;
int ask(int *cc,int i){
	int res=cc[0];
	while(i>0) res=min(res,cc[i]),i-=i&-i;
	return res;
}
void ins(int *cc,int i,int x){
	if(!i) return;
	while(i<=d) cc[i]=min(cc[i],x),i+=i&-i;
}
void _push(int x,int y,int k){
	if(q1.empty()||f[q1.front()][q2.front()][q3.front()]>f[x][y][k]) 
		q1.push_front(x),q2.push_front(y),q3.push_front(k);
	else q1.push_back(x),q2.push_back(y),q3.push_back(k);
	vis[x][y][k]=1;
}
int main(){
	freopen("escapea.in","r",stdin);
	freopen("escapea.out","w",stdout);
	int i,j,x,y,k,flag;
	memset(c,0x3f,sizeof c);
	memset(f,0x3f,sizeof f);
	scanf("%d%d%d",&n,&m,&d);
	for(i=1;i<=n;i++)
		scanf("%s",map[i]+1);
	q1.push_back(1),q2.push_back(1),q3.push_back(0);
	f[1][1][0]=c[1][1][0]=0,ans=inf;
	while(!q1.empty()){
		x=q1.front(),y=q2.front(),k=q3.front();
		q1.pop_front(),q2.pop_front(),q3.pop_front(),vis[x][y][k]=0;
		for(i=x-1,j=1,flag=1;i>0&&j+k<=d;i--,j++){
			if(map[i][y]=='P'){
				if(f[i][y][j+k]>f[x][y][k]+1){
					f[i][y][j+k]=f[x][y][k]+1;
					if(ask(c[i][y],j+k)>=f[i][y][j+k]){
						ins(c[i][y],j+k,f[i][y][j+k]);
						if(!vis[i][y][j+k]) _push(i,y,j+k);
					}
				}
				if(flag&&f[i][y][k]>f[x][y][k]+j){
					f[i][y][k]=f[x][y][k]+j;
					if(ask(c[i][y],k)>=f[i][y][k]){
						ins(c[i][y],k,f[i][y][k]);
						if(!vis[i][y][k]) _push(i,y,k);
					} 
				}
			} 
			else flag=0;
		}
		if(i>0&&flag){
			while(i>0){
				if(map[i][y]!='P') break;
				if(f[i][y][k]>f[x][y][k]+j) {
					f[i][y][k]=f[x][y][k]+j;
					if(ask(c[i][y],k)>=f[i][y][k]){
						ins(c[i][y],k,f[i][y][k]);
						if(!vis[i][y][k]) _push(i,y,k);
					} 
				}
				i--,j++;
			}
		}
		for(i=x+1,j=1,flag=1;i<=n&&j+k<=d;i++,j++){
			if(map[i][y]=='P'){
				if(f[i][y][j+k]>f[x][y][k]+1){
					f[i][y][j+k]=f[x][y][k]+1;
					if(ask(c[i][y],j+k)>=f[i][y][j+k]){
						ins(c[i][y],j+k,f[i][y][j+k]);
						if(!vis[i][y][j+k]) _push(i,y,j+k);
					}
				}
				if(flag&&f[i][y][k]>f[x][y][k]+j){
					f[i][y][k]=f[x][y][k]+j;
					if(ask(c[i][y],k)>=f[i][y][k]){
						ins(c[i][y],k,f[i][y][k]);
						if(!vis[i][y][k]) _push(i,y,k);
					} 
				}
			} 
			else flag=0;
		}
		if(i<=n&&flag){
			while(i<=n){
				if(map[i][y]!='P') break;
				if(f[i][y][k]>f[x][y][k]+j) {
					f[i][y][k]=f[x][y][k]+j;
					if(ask(c[i][y],k)>=f[i][y][k]){
						ins(c[i][y],k,f[i][y][k]);
						if(!vis[i][y][k]) _push(i,y,k);
					} 
				}
				i++,j++;
			}
		}
		for(i=y-1,j=1,flag=1;i>0&&j+k<=d;i--,j++){
			if(map[x][i]=='P'){
				if(f[x][i][j+k]>f[x][y][k]+1){
					f[x][i][j+k]=f[x][y][k]+1;
					if(ask(c[x][i],j+k)>=f[x][i][j+k]){
						ins(c[x][i],j+k,f[x][i][j+k]);
						if(!vis[x][i][j+k]) _push(x,i,j+k);
					}
				}
				if(flag&&f[x][i][k]>f[x][y][k]+j){
					f[x][i][k]=f[x][y][k]+j;
					if(ask(c[x][i],k)>=f[x][i][k]){
						ins(c[x][i],k,f[x][i][k]);
						if(!vis[x][i][k]) _push(x,i,j);
					}
				}
			} 
			else flag=0;
		}
		if(i>0&&flag){
			while(i>0){
				if(map[x][i]!='P') break;
				if(f[x][i][k]>f[x][y][k]+j){
					f[x][i][k]=f[x][y][k]+j;
					if(ask(c[x][i],k)>=f[x][i][k]){
						ins(c[x][i],k,f[x][i][k]);
						if(!vis[x][i][k]) _push(x,i,j);
					}
				}
				i--,j++;
			}
		}
		for(i=y+1,j=1,flag=1;i<=m&&j+k<=d;i++,j++){
			if(map[x][i]=='P'){
				if(f[x][i][j+k]>f[x][y][k]+1){
					f[x][i][j+k]=f[x][y][k]+1;
					if(ask(c[x][i],j+k)>=f[x][i][j+k]){
						ins(c[x][i],j+k,f[x][i][j+k]);
						if(!vis[x][i][j+k]) _push(x,i,j+k);
					}
				}
				if(flag&&f[x][i][k]>f[x][y][k]+j){
					f[x][i][k]=f[x][y][k]+j;
					if(ask(c[x][i],k)>=f[x][i][k]){
						ins(c[x][i],k,f[x][i][k]);
						if(!vis[x][i][k]) _push(x,i,k);
					}
				}
			} 
			else flag=0;
		}
		if(i<=m&&flag){
			while(i>0){
				if(map[x][i]!='P') break;
				if(f[x][i][k]>f[x][y][k]+j){
					f[x][i][k]=f[x][y][k]+j;
					if(ask(c[x][i],k)>=f[x][i][k]){
						ins(c[x][i],k,f[x][i][k]);
						if(!vis[x][i][k]) _push(x,i,k);
					}
				}
				i++,j++;
			}
		}
	}
	ans=ask(c[n][m],d);
	if(ans!=inf) printf("%d\n",ans);
	else puts("impossible");
}