数据范围这么大,模拟绝对tle。于是考虑数学方法。
先一圈圈搜索,找到所求坐标所在的那一圈,再判断。
对于
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
第一圈的数有1~12,他们的特点是横坐标在第一或倒数第一行,或纵坐标在第一或倒数第一列。
第二圈同理。
#include<bits/stdc++.h>
using namespace std;
long long n,i,j,s=0;
void dfs(long long x,long long y)
{
int a=1,t=n-1;bool flag=true;//t是当前圈的计数标记,如对于n=4,第一圈有3*4个数,第二圈有1*4个数
while(flag)//寻找所求坐标所在的那一圈
{
if(a==x||n-a+1==x||a==y||n-a+1==y)flag=false;
if(flag)//如果不在当前一圈,s加上当前一圈的数的个数,并准备搜下一圈
{
a++;
s=s+4*t;
t-=2;
}
}
if(a==x)s=s+y-a+1;//所求坐标在当前的一圈,进行计数,建议配合矩阵进行思考,并思考为什么要用else
else if(n-a+1==x)s=s+t*2+n-a+1-y+1;
else if(a==y)s=s+t*4-(x-a-1);
else s=s+t+x-a+1;
return;
}
int main()
{
scanf("%lld%lld%lld",&n,&i,&j);
dfs(i,j);
printf("%lld",s);
return 0;
}