记录编号 153528 评测结果 AAAAAAAAAA
题目名称 [HNOI 2006]马步距离 最终得分 100
用户昵称 Gravatarztx 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2015-03-18 06:12:42 内存使用 0.32 MiB
显示代码纯文本
/****************************************\
* Author : ztx
* Title  : [bzoj] 1193: [HNOI2006]马步距离
* ALG    : 贪心 bfs 搜索
* CMT    : 大范围贪心跳,小范围bfs
* Time   :
\****************************************/

#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
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 reads(TP& ret) {
	while (ret=getchar() , ret<'!') ;
	while (CH=getchar() , CH>'!') ;
}

#define Abs(x) ((x)<0?(-(x)):(x))

#define  ii  std::pair<int,int>

#include <queue>

const int dx[8] = {1,2,1,2,-1,-2,-1,-2} ;
const int dy[8] = {2,1,-2,-1,2,1,-2,-1} ;

#define  maxn  51LL

int dis[51][51] = {0} ;
std::queue< ii > q ;

void bfs(int x , int y) {
int tx , ty , i ;
	q.push(ii(x,y)) ;
	while (!q.empty()) {
		x=q.front().first , y=q.front().second ;
		q.pop() ;
		if (x==5&&y==5) return ;
		Rep (i,0,7) {
			tx=x+dx[i] , ty=y+dy[i] ;
			if (tx<1||ty<1||tx>50||ty>50) continue ;
			if (!dis[tx][ty] || dis[tx][ty]>dis[x][y]+1) {
				dis[tx][ty] = dis[x][y]+1 ;
				q.push(ii(tx,ty)) ;
			}
		}
	}
}

int sx , sy , x , y , cnt ;

int main() {
	#define READ
	#ifdef  READ
		freopen("horsed.in" ,"r",stdin ) ;
		freopen("horsed.out","w",stdout) ;
	#endif
	read(sx) , read(sy) , read(x) , read(y) ;
	x -= sx , y -= sy ;
	if (x < 0) x = -x ;
	if (y < 0) y = -y ;
	cnt = 0 ;
	while (Abs(x)+Abs(y) > 30) {
/*大范围贪心*/
		if (x > y) { cnt++ ; x-- , x-- , y-- ; }
		else { cnt++ ; x-- , y-- , y-- ; }
		if (x<0) x = -x ;
		if (y<0) y = -y ;
	}
	x += 5 , y += 5 ;
	dis[x][y] = cnt ;
	/*这时bfs找dis(5,5)*/
	bfs(x,y) ;
	printf("%d\n", dis[5][5]) ;
	#ifdef  READ
		fclose(stdin) ; fclose(stdout) ;
	#else
		getchar() ; getchar() ;
	#endif
	return 0 ;
}