参考某神牛的解题思路。。orz
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cmath>
using namespace std;
const int INF = ~0U >> 1;
const int maxn = 30000+10;
const int nx[] = {-1, 0, 1, 1, 0};
const int ny[] = {1, 2, 1, -1, -2};
struct node
{
int x, y;
node(int a, int b) : x(a), y(b) { }
node() : x(0), y(0) { }
}str[maxn];
void init()
{
int x = 0, y = 0;
int cnt = 1;
str[cnt++] = node(x, y);
y -= 2;
str[cnt++] = node(x, y);
for(int i = 1; i < 70; ++i) {
for(int j = 0; j < 5; ++j)
for(int k = 0; k < i; ++k) {
x += nx[j], y += ny[j];
str[cnt++] = node(x, y);
}
y -= 2;
str[cnt++] = node(x, y);
for(int j = 0; j < i; ++j) {
--y;
--x;
str[cnt++] = node(x, y);
}
}
return ;
}
int main()
{
init();
int a, b;
while(scanf("%d%d", &a, &b) != EOF && a && b) {
int x = abs(str[a].x - str[b].x);
int y = abs(str[a].y - str[b].y);
printf("The distance between cells %d and %d is ", a, b);
if(y <= x) printf("%d.\n", x);
else printf("%d.\n", x + (y - x) / 2);
// printf("%d.\n", (x + y) / 2);
}
return 0;
}