#include<stdio.h> #define abs(a) ((a)>0?(a):(-a)) #define max(a,b) ((a)>(b)?(a):(b)) int foo(int x,int y)...{ int t=max(abs(x),abs(y)); //求x,y的最大值 int u=2*t; int v=u-1; v=v*v+u; //每个边长为t的正方形的右下角位置的值,如(2,2) // 下边都是先找到上面说的正方形的每个边的中点位置值 if(x==-t) v+=u+t-y; //中点:v+u+t;如x=-2,v+u+t=19 elseif(y==-t) v+=3*u+x-t; //中点:v+3*u-t;如y=-2,v+3*u-t=23 elseif(y==t) v+=t-x; else v+=y-t; return v; //注意:x,y与t,-t,比较的顺序不能变,必须先比较负的t。x,y的顺序可变。 } //输出 int main() ...{ int x,y; for(y=-4;y<=4;y++)...{ for(x=-4;x<=4;x++) printf("%5d",foo(x,y)); printf(" /n"); }
while(scanf("%d%d", &x,&y) == 2)
printf("%d/n"),foo(x,y); return0; }
解法二:给定一个坐标值(x,y) ,取得|x|,|y|中的最大值为c,得出所在正方形边的长度为2c+1,正方形右上角顶点值为2c+1的平方p,它的坐标为(m, n)(负坐标),次级正方形的右上角顶点值为2c-1的平方q,它的坐标为(j, k)(负坐标),y-n值的绝对值为d,x-m值的绝对值为b,判断d和b的值,1. d==0 && b==0,对应的值为p 2. x == c || y == c,对应的值为q+d+b 3. x == -c || y == -c,对应的值为p-d-b
#include <stdio.h> #define max(a, b) ((a) > (b) ? (a) : (b)) #define abs(a) ((a) > 0 ? (a) : -(a)) int foo(int x, int y) ...{ int c = max(abs(x), abs(y)); int p = (2* c +1) * (2* c +1); int m = c; int n =-c; int q = (2* c -1) * (2* c -1); int d = abs(y - n); int b = abs(x - m); if (d ==0&& b ==0) return p; elseif (x == c || y == c) return q + d + b; elseif (x ==-c || y ==-c) return p - d - b; else printf("error "); /**//* 这种情况不会发生 */ return0; } int main() ...{ int x, y; for (y =-4; y <=4; y++) ...{ for (x =-4; x <=4; x++) printf("%5d", foo(x, y)); printf(""); } while (scanf("%d %d", &x, &y) ==2) printf("%d ", foo(x, y)); return0; }