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; }