思维难点: 对于这种坐标系,直接蒙逼。 但是,对于二维平面只要有两条不共线的向量,我们就可以表示出这个平面,也就是说 任何的点(或者说是以(0,0)为起点,以(x,y)为终点的向量) ,都能通过两个不共线的向量表示出来。通过建立平面直角坐标系,可以发现 在不同象限 向量长度的规律。
!!!注意: 程序中的坐标起点在左上角,和正常的不一样,别忘了。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define PII pair<int,int>
typedef long long LL;
const int maxn=2000+10;
map<int ,PII > pos;
int dir[6][2]={{-1,-1},{-1,0},{0,1},{1,1},{1,0},{0,-1}};
void init(){
PII p=make_pair(0,0);
pos[1]=p;
int num=1;
int x=1,y=0,d=1;
while(num<10000){
for(int i=0;i<6;i++){
int tmp=d;
while(tmp--){
num++;
x=x+dir[i][0],y=y+dir[i][1];
p=make_pair(x,y);
pos[num]=p;
// printf("num:%d (%d,%d)\n",num,x,y);
if(num>10000)break;
}
}
d++;
y++;
x++,y--;
}
}
int main(){
init();
int x,y;
while(scanf("%d %d",&x,&y)==2&&x&&y){
PII p1=pos[x],p2=pos[y];
int ansx=p1.first-p2.first,ansy=p1.second-p2.second;
int ans;
if(ansx*ansy>0)ans=max(abs(ansx),abs(ansy));
else ans=abs(ansx)+abs(ansy);
// printf("(%d,%d) (%d,%d)\n",p1.first,p1.second,p2.first,p2.second);
printf("The distance between cells %d and %d is %d.\n",x,y,ans);
}
return 0;
}