#include typedef struct { int l; int d[10000]; } tNum; tNum A,B; int C1,C2; void utras(void) { int i; for (i=0;i=cim) { B.d[kde]=A.d[kde]/cim; if (!B.l) B.l=kde+1; A.d[kde]%=cim; } else { A.d[kde-1]+=10*A.d[kde]; kde--; } } B.d[0]=A.d[0]/cim; if (!B.l) B.l=1; memcpy(&A,&B,sizeof(tNum)); } void comb(int n, int k) { int i; memset(A.d,0,sizeof(A.d)); A.l=1; A.d[0]=1; if (2*k>n) k=n-k; for (i=0;i=C) { kdex=kdey=1-kolo; if (uz+kolo>=C) { (*x)=kdex; (*y)=kdey+(C-uz-1); break; } kdey+=kolo; uz+=kolo; if (uz+kolo>=C) { (*x)=kdex+(C-uz-1); (*y)=kdey+(C-uz-1); break; } kdex+=kolo; kdey+=kolo-1; uz+=kolo; if (uz+kolo>=C) { (*x)=kdex+(C-uz-1); (*y)=kdey; break; } kdex+=kolo-1; kdey-=1; uz+=kolo; if (uz+kolo>=C) { (*x)=kdex; (*y)=kdey-(C-uz-1); break; } kdey-=kolo; kdex-=1; uz+=kolo; if (uz+kolo>=C) { (*x)=kdex-(C-uz-1); (*y)=kdey-(C-uz-1); break; } kdex-=kolo; kdey-=kolo; kdey++; uz+=kolo; (*x)=kdex-(C-uz-1); (*y)=kdey; break; } else { kolo++; uz+=dlzka; } } } int main(void){ int x1,y1,x2,y2,D,i; while (1) { scanf("%d %d ",&C1,&C2); if (!C1) break; coord(C1,&x1,&y1); coord(C2,&x2,&y2); if (y1==y2) { printf("There is 1 route of the shortest length %d.\n",abs(x2-x1)); } else { if (y1>y2) { x1^=x2^=x1^=x2; y1^=y2^=y1^=y2; } if (x2<=x1) { D=(x1-x2)+(y2-y1); comb(D,x1-x2); } else { if (x2<=x1+(y2-y1)) { D=y2-y1; comb(D,x2-x1); } else { D=x2-x1; comb(D,y2-y1); } } if ((A.l==1) && (A.d[0]==1)) { printf("There is 1 route of the shortest length %d.\n",D); } else { printf("There are "); for (i=A.l-1;i>=0;i--) printf("%d",A.d[i]); printf(" routes of the shortest length %d.\n",D); } } } return 0; }