HOJ 1009Fat Cat
一道暴力题
处理出老鼠到达每个点的时间
用这个时间与猫的位置与这个点的曼哈顿距离取min
再取max就行了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read(){
int x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline int min(int x,int y){
return x<y?x:y;
}
inline int max(int x,int y){
return x>y?x:y;
}
inline int cal_abs(int x){
return max(x,-x);
}
int n,m;
int a[100][100];
int dis[100][100];
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
memset(dis,0x3f,sizeof(dis));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i][j]=read();
int s=read(),t=read();
dis[0][0]=0;a[0][0]=0;
int x=0,y=0;
while(1){
int maxn=0;
if(x) maxn=max(maxn,a[x-1][y]);
if(y) maxn=max(maxn,a[x][y-1]);
if(x<n-1) maxn=max(maxn,a[x+1][y]);
if(y<m-1) maxn=max(maxn,a[x][y+1]);
if(maxn==0) break;
if(x&&maxn==a[x-1][y]) dis[x-1][y]=dis[x][y]+1,a[x-1][y]=0,--x;
if(y&&maxn==a[x][y-1]) dis[x][y-1]=dis[x][y]+1,a[x][y-1]=0,--y;
if(x<n-1&&maxn==a[x+1][y]) dis[x+1][y]=dis[x][y]+1,a[x+1][y]=0,++x;
if(y<m-1&&maxn==a[x][y+1]) dis[x][y+1]=dis[x][y]+1,a[x][y+1]=0,++y;
}
// cout<<dis[0][1]<<"\t"<<s<<"\t"<<t<<endl;
int ans=0x3f3f3f3f;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(dis[i][j]!=0x3f3f3f3f&&dis[i][j]>=(cal_abs(s-i)+cal_abs(t-j)))
ans=min(ans,max(dis[i][j],cal_abs(s-i)+cal_abs(t-j)));
if(ans==0x3f3f3f3f) puts("impossible");
else printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号