#include #include #include using namespace std; const int maxN = 1000 + 10; const int maxM = 1000 + 10; const int inf = 0x3f3f3f3f; struct Point { int x , y; Point() {} Point(int x0 , int y0) : x(x0) , y(y0) {} }; typedef Point Vector; Vector mv[8] = {Vector(2 , -1) , Vector(2 , 1) , Vector(-2 , -1) , Vector(-2 , 1) , Vector(1 , -2) , Vector(1 , 2) , Vector(-1 , -2) , Vector(-1 , 2)}; Point operator + (Point p , Vector v) { return Point(p.x+v.x , p.y+v.y); } queue que; int N , M , d[maxN][maxM]; int can_go(Point p) { if(p.x > 0 && p.x <= N && p.y > 0 && p.y <= M) return 1; else return 0; } int main() { int T; scanf("%d",&T); for(int kcase = 1; kcase <= T; kcase++) { int K; scanf("%d%d%d",&N,&M,&K); Point king , knight; scanf("%d%d",&king.x,&king.y); scanf("%d%d",&knight.x,&knight.y); for(int i = 1; i <= N; i++) { for(int j = 1; j <= M; j++) { d[i][j] = inf; } } que.push(knight); d[knight.x][knight.y] = 0; while(!que.empty()) { Point u = que.front(); que.pop(); for(int i = 0; i < 8; i++) { Point v = u + mv[i]; if(can_go(v) && d[v.x][v.y] > d[u.x][u.y]+1) { d[v.x][v.y] = d[u.x][u.y]+1; que.push(v); } } } int ans = inf; for(int i = 1; i <= N; i++) { for(int j = 1; j <= M; j++) { if(d[i][j] > K) continue; int tmp1 = min(abs(king.x-i) , abs(king.y-j)); int tmp2 = tmp1 + (abs(king.x-i)-tmp1) + (abs(king.y-j)-tmp1); if((tmp2&1) != (d[i][j]&1)) { if(tmp2) tmp2++; else tmp2 += 3; } if(max(tmp2 , d[i][j]) <= K) ans = min(ans , max(tmp2 , d[i][j])); } } printf("Case #%d:\n",kcase); if(ans > K) puts("OH,NO!"); else printf("%d\n",ans); } return 0; }