沧海一声喵 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;}