洛谷p2239 螺旋矩阵

来源:互联网 发布:河北省网络行政学院 编辑:程序博客网 时间:2024/05/20 18:55

数据范围这么大,模拟绝对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;//所求坐标在当前的一圈,进行计数,建议配合矩阵进行思考,并思考为什么要用elseelse 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;}