欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程资源 > 编程问答 >内容正文

编程问答

sicily 1694. spiral -尊龙游戏旗舰厅官网

发布时间:2025/1/21 编程问答 9 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 sicily 1694. spiral 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

训练的题目

模拟题,蛇形矩阵,保证是n*n的矩阵,并且n是奇数 , 在矩阵中填数,从最中心开始填,逆时针转圈,1,2,3…………n*n。输入n,表示矩阵的大小,输入一个数字m,找出m在矩阵的哪行哪列

其实这个蛇形矩阵可以分为一圈一圈来看,要找m,可以先确定它在哪一圈

每一圈都值的范围是  [ k^2 1 , (k 2)*(k 2) ] ,其中k是奇数

看一圈的四个角,

右上角最大:  max = (k 2)*(k 2)

左上角次之:  max - (k 2) 1

左下角再次: max - 2*(k 2) 2

右下角 :     max - 3*(k 2) 3

 

所以可以以这4个值作为一个范围,将这个圈分成4份,叫做 上行 ,  左列  ,  下行  ,  右列

这4分里面的数字是连续的,要在里面找一个值,直接扫描即可

 

代码写得不是很好,后来没修改了

#include #include #define max 32768typedef long long ll; ll nn[max 10]; ll pos,n;void init() {memset(nn,0,sizeof(nn));for(ll i=1; i<=max 6; i =2)nn[i] = i*i; }ll search(ll p) {for(ll i=1; ; i =2)if(nn[i] < p && p <= nn[i 2])return i;return -1; }int main() {init();int t;scanf("%d",&t);while(t--){scanf("%lld%lld",&n,&pos);if(pos == 1){printf("%lld %lld\n",(n 1)/2 , (n 1)/2);continue;}ll m = search(pos);ll max = (m 2)*(m 2);ll q = (m 1)/2;//【 m*m 1 , (m 2)*(m 2) 】//找到在第q圈 ll r , c;ll k;ll temp;if(pos <= max && pos > max-(m 2) 1) //上行 {r = (n 1)/2 - q;c = (n 1)/2 q;temp = max;for(k=c; ;k--,temp--)if(temp == pos)break;printf("%lld %lld\n",r,k);}else if(pos <= max-(m 2) 1 && pos > max-2*(m 2) 2 ) //左列 {c = (n 1)/2 - q;r = (n 1)/2 - q;temp = max-(m 2) 1;for(k=r; ;k ,temp--)if(temp == pos)break;printf("%lld %lld\n",k,c);}else if(pos <= max-2*(m 2) 2 && pos > max-3*(m 2) 3 ) //下行 {r = (n 1)/2 q;c = (n 1)/2 - q;temp = max-2*(m 2) 2;for(k=c; ;k ,temp--)if(temp == pos)break;printf("%lld %lld\n",r,k);}else if( pos <= max-3*(m 2) 3 && pos > max-4*(m 2) 4)//右列 {c = (n 1)/2 q;r = (n 1)/2 q;temp = max-3*(m 2) 3;for(k=r; ;k--,temp--)if(temp == pos)break;printf("%lld %lld\n",k,c);}}return 0; }

 

总结

以上是尊龙游戏旗舰厅官网为你收集整理的sicily 1694. spiral的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

网站地图