讨论 / 解析如下
沧海一声喵 2018-01-22 04:16:25
点我顶贴 收藏 删除
/* 等差数列法:

定义行i列j。从外向内分层,一圈一层。定义r:(r>=1)当前圈为第几圈。

定义N:图形高度

定义l:当前圈边长l

l(1)=N-1

l(r)=N-2*(r-1)-1

设当前圈左上角为开始。

定义d:当前行的方向(上边为0右边为1下边为2左边为3)

定义p:当前圈当前边距角的长度(向数字小的方向)

定义a:当前圈共有多少个数字

a(r)=4*l(r)=4*(N-2*(r-1))-4

公差为-8

从最外圈到当前圈求和:s(r)=a(1)*r-r*(r-1)/2*(-8)

定义b:本圈第一个数字

b(r)=s(r-1)+1

=a(1)*(r-1)-(r-1)*(r-2)/2*(-8)+1

开始计算:

求r: r=min(i,N-j+1,N-i+1,j)

求d: d为(0,1,2,3)与r对应,如r如第1个值,则d为第1个值...

求p: p=(j-r,i-r,N-j+1-r,N-i+1-r)与r对应,如r如第1个值,则d为第一个值...

当前数值b+l*d+p*/

#include <stdio.h>

int main(){

int n,s,t,r,d,p,m,b;

scanf("%d%d%d",&n,&s,&t);

r=s;d=0;p=t-r;

if (r>n-t+1) {r=n-t+1;d=1;p=s-r;}

if (r>n-s+1) {r=n-s+1;d=2;p=n-t+1-r;}

if (r>t) {r=t;d=3;p=n-s+1-r;}

m=(n-1)-2*(r-1);

b=4*(n-1)*(r-1)-4*(r-1)*(r-2)+1;

printf("%d",b+m*d+p);

return 0;}

查看更多回复
提交回复