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

  

posted @ 2018-09-28 20:15  古城独钓  阅读(137)  评论(0编辑  收藏  举报