中石油 位置

网友投稿 785 2022-10-30

中石油 位置

中石油 位置

题目描述

由于晨晨还没有研究出核心算法,在游戏中总是被明明击败。晨晨拿出了杀手锏进行反击,精心设计了一个大型取数字求位置的难题:NN( N是奇数)个地砖,每个上面写有一个编号,这些编号正好是1到N平方。她把这些地砖按次序从中间开始螺旋的铺垫在地上,形成一个NN的正方形。N=5时如下图:

每块地砖的位置用行列编号表示。左上的地砖位置为第一行第一列,右下的地砖位置为第N行第N列。上图中编号3的地砖在第2行第3列。

如果一块地砖在X行Y列,则位置编码为XN+Y。例如:上图中编号是1的地址位置编码是:53+3 = 18;编号是5的地址位置编码是:5*3+4 = 19。

晨晨要明明计算,从数A的位置编码是什么。比如:N=5,A=6,为: 24

每次提问前,晨晨想知道正确的答案,请编程计算出位置编码。

输入 第一行:1个奇数N。 第二行:1个整数A。(0

输出 一个整数,表示编号A地砖的位置编码。 样例输入 Copy 5 20 样例输出 Copy 28 提示 数据范围:80%数据0

题意分析:由于0

上面5个一块。下面五个一块,左右各一块。可是没做出来,后来参考

中间有点没搞明白,就是&的使用。

考完正解思路立马清醒。一共分四块,

然后 分类讨论一下即可注意一下,这个题目会爆int,所以所有数据都用longlong就ok了,还有递归在层数等于1的时候记得特判一下就没问题了

#include using namespace std;typedef long long LL;LL x,y;void f(LL a,LL b) { LL l=(b-2)*(b-2);//次外层 LL d=b*b;//最外层 if(b==1) {//单独考虑为一层时这种情况。 x=y=1; return; } if(a>l&&a<=d) {//判断是否在最外层 if(a>l&&a<=l+(b-1)) {//第一种情况 x=1; y=a-l; return; } else if(a>l+(b-1)&&a<=l+2*(b-1)) {//第二种情况 y=b; x=a-(l+b-1); return; } else if(a>l+2*(b-1)&&a<=l+3*(b-1)) {//第三种情况 x=b; y=b-(a-(l+2*(b-1)))+1;//b-后面的保证列正确 return; } else {//第四种情况 y=1; x=b-(a-(l+3*(b-1)))+1;//用b-后面的保证行正确 return; } } else { f(a,b-2);//由外层到内层 x++;//进一层x和y都会减一所以在后面加上。 y++; return; }}int main() { LL n,m; scanf("%lld%lld",&n,&m); f(m,n); printf("%lld\n",n*x+y);//输出位置 return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:DotnetSpider是开源的.NET跨平台数据采集爬虫框架
下一篇:mybatis源码解读之executor包语句处理功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~