數數字
假設今天有一種特殊的方陣,邊長為 7,且該方陣的每個元素是由外到內從 1 開始不斷增加,如以下範例:
①①①①①①①
①②②②②②①
①②③③③②①
①②③④③②①
①②③③③②①
①②②②②②①
①①①①①①①
給定一個數字 k(例如 11),則從方陣的左上角開始,以斜向且接續的方式數到第 11 個數字(數的方式如下圖),例如以上的範例為 1,則問題的答案即為 1。
①②⑥⑦⑮
③⑤⑧⑭⑯
④⑨⑬⑰㉒
⑩⑫⑱㉑㉓
⑪⑲⑳㉔㉕
Input
第一行代表測資的筆數 n。接下來有 n 行,每行兩個數字以空白間隔,第一個數字代表方陣的邊長,第二個數字 k 代表要求的第 k 個數。
Output
將數到的第 k 個數字輸出。
範例輸入:
3
7 11
3 5
4 9
範例輸出:
1
2
2
/*----- ----- ----- -----*/ //2-數數字 //Made by 105502555 Teemo Hsu(Synasaivaltos) //Date: 2018/05/14 /*----- ----- ----- -----*/ #include <iostream> #include <vector> using namespace std; int sqrmatrix_value(int l,int a,int b) { int x=(a<=l/2?a:l-a+1),y=(b<=l/2?b:l-b+1); return (x<=y?x:y); } int main(void) { int n; cin >> n; vector<int> ans; while(--n>=0) { int l,k; cin >> l >> k; int a=0,b=0,cnt=1; bool tl=false; while(true) { if(tl) { if(b==l-1) { a++; tl=!tl; } else if(a==0) { b++; tl=!tl; } else { b++; a--; } } else { if(a==l-1) { b++; tl=!tl; } else if(b==0) { a++; tl=!tl; } else { a++; b--; } } if(cnt==k-1) { ans.push_back(sqrmatrix_value(l,a+1,b+1)); break; } cnt++; } } for(int i=0;i<ans.size();cout<<ans.at(i)<<endl,i++); return 0; } |