上面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小时内删除侵权内容。