如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
思路:
就是单纯的找规律,以第二象限的对角线为起点,2 12 30 56 可知它们之间相差10 18 26
这样就很明显了,它们之间有相差8,所以得出公式sum+=10+8*i(x,y!=0)
注意:他的难点在第三象限,因为拐角不在对角线,这就需要再分析一下
我的思路是找到x和y+1中的最大值,然后竖着的一种情况,横着的一种情况。(源码如下)
#include"iostream"
#include"algorithm"
#include"stdlib.h"
using namespace std;
int main(){
int x,y;
cin>>x>>y;
int sum=2;
int m;
int qyc=10;
m=max(abs(x),abs(y));
cout<<m<<endl;
if(m==0){
sum=0;
}
else{
for(int i=0;i<m-1;i++){
sum+=10+8*i;
cout<<"sum= "<<sum<<endl;
}
}
// cout<<sum<<endl;
if(y>=0){
if(x<0){
if(abs(x)>=y){
sum-=(abs(x)-y);
}
else{
sum+=(y-abs(x));
}
}
if(x>=0){
if(x>=y){
sum+=(x-y+m*2);
}
else{
sum+=(y-x+m);
}
}
}
else{
if(x>=0){
if(abs(x)>=abs(y)){
sum+=(4*m-abs(x)+abs(y));
}
else{
sum+=(4*m-abs(x)+abs(y));
}
}
if(x<0){
int n;
n=max(abs(x),abs(y-1));
cout<<n<<endl;
int xx=2;
for(int i=0;i<n-1;i++){
xx+=(10+8*i);
}cout<<"sum= "<<xx<<endl;
if(abs(x)>=(abs(y)+1)){
xx-=(2*abs(x)-(abs(abs(x)-abs(y))));
}
else{
xx-=(2*abs(y-1)+(abs(abs(x)-abs(y))));
}
sum=xx;
}
}
cout<<"最后="<<sum;
}