HDOJ 1030 Delta-wave
找规律的题,对每一个数字对应一个三维坐标(X,Y,Z)
X::表示在第几层
Y:从左边的边数在第几个
Z::从右边的边数在第几个
对倒三角要特殊处理(Z减一)
如:1(1,1,1) 2(2,2,1) 3(2,1,1)
距离就是坐标差点绝对值。
1 #include <iostream> 2 #include <cmath> 3 4 using namespace std; 5 6 struct Note 7 { 8 int x; 9 int y; 10 int z; 11 }; 12 13 int main() 14 { 15 Note a,b; 16 int m,n; 17 while(cin>>m>>n) 18 { 19 20 int sa=0; 21 int sb=0; 22 int k; 23 int t=ceil(sqrt(m)); 24 a.x=t; 25 k=(m-(t-1)*(t-1))/2; 26 a.y=t-k; 27 k=((2*t-1)-m+(t-1)*(t-1))/2; 28 a.z=t-k; 29 if((2*t-1-m+(t-1)*(t-1))%2==0) sa=1; 30 if(sa==0) a.z=a.z-1; 31 32 t=ceil(sqrt(n)); 33 b.x=t; 34 k=(n-(t-1)*(t-1))/2; 35 b.y=t-k; 36 k=((2*t-1)-n+(t-1)*(t-1))/2; 37 b.z=t-k; 38 if((2*t-1-n+(t-1)*(t-1))%2==0) sb=1;; 39 if(sb==0) b.z=b.z-1; 40 41 //cout<<a.x<<" "<<a.y<<" "<<a.z<<endl; 42 //cout<<b.x<<" "<<b.y<<" "<<b.z<<endl; 43 44 int ans=0; 45 ans=abs(a.x-b.x)+abs(a.y-b.y)+abs(a.z-b.z); 46 47 cout<<ans<<endl; 48 } 49 50 51 return 0; 52 }