Sicily 1694. Spiral
生活随笔
收集整理的這篇文章主要介紹了
Sicily 1694. Spiral
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
訓練的題目
模擬題,蛇形矩陣,保證是n*n的矩陣,并且n是奇數(shù) , 在矩陣中填數(shù),從最中心開始填,逆時針轉(zhuǎn)圈,1,2,3…………n*n。輸入n,表示矩陣的大小,輸入一個數(shù)字m,找出m在矩陣的哪行哪列
其實這個蛇形矩陣可以分為一圈一圈來看,要找m,可以先確定它在哪一圈
每一圈都值的范圍是 ?[ k^2+1 , (k+2)*(k+2) ] ,其中k是奇數(shù)
看一圈的四個角,
右上角最大: ?max = (k+2)*(k+2)
左上角次之: ?max - (k+2) + 1
左下角再次: max - 2*(k+2) + 2
右下角 : ? ? max - 3*(k+2) + 3
?
所以可以以這4個值作為一個范圍,將這個圈分成4份,叫做 上行 , ?左列 ?, ?下行 ?, ?右列
這4分里面的數(shù)字是連續(xù)的,要在里面找一個值,直接掃描即可
?
代碼寫得不是很好,后來沒修改了
#include <cstdio> #include <cstring> #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; }?
總結(jié)
以上是生活随笔為你收集整理的Sicily 1694. Spiral的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【实战HTML5与CSS3 第一篇】初探
- 下一篇: 【C++学习】String类的基本用法