切換
舊版
前往
大廳
主題

[創作|作業][C++]演算法Week7:2-數數字

極巨龍神塔奇 | 2018-05-21 20:45:04 | 巴幣 6 | 人氣 358

數數字
假設今天有一種特殊的方陣,邊長為 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;
}
送禮物贊助創作者 !
0
留言

創作回應

通知侍者
手機版打招呼><
2018-05-21 22:21:55
極巨龍神塔奇
Yee><
2018-05-21 22:35:36
小坤
https://home.gamer.com.tw/creationDetail.php?sn=3997380
花了我一個半小時搞這個,在大測資有明顯加速
1
1000 499999
2018-05-22 01:24:44
極巨龍神塔奇
我完全不想花腦做數學w
2018-05-22 02:29:55

更多創作