Board logo

標題: 有點難度的編程題目 [打印本頁]

作者: haloPaul    時間: 2019-7-28 14:55     標題: 有點難度的編程題目

本帖最後由 haloPaul 於 2019-7-28 14:56 編輯

1 2 3 4
2       5
1       6
0 9 8 7

輸入Size = 4 就會打印出以上的圖案
這條題目我思考了很久,可能是我比較蠢吧,想了很久也想不到答案。
請問有沒有高手想出解決這個問題的算法?
我唯一的思路就只有先做上邊,然後右邊,再下邊,再左邊。
作者: gakko    時間: 2019-7-28 15:36

你講得唔清唔楚
可以點幫你姐
  1.     int input;
  2.     printf("Size=");
  3.     scanf("%d", &input);
  4.     if(input==4) { printf("1234\n2  5\n1  6\n0987"); }
複製代碼
如果係一個SEQ既問題, 咁應該提供埋打其他數字會係點既情況
作者: lpc041088    時間: 2019-7-28 16:13

睇落由1至9再到0,overflow再去返1至9 print條邊?
個次序係從左上角開始
先向右之後向下
再向返左,最後向上

假如Size = 5應該出
1 2 3 4 5
6          6
5          7
4          8
3 2 1 0 9

題目係咁樣?
作者: 狂蜂一號    時間: 2019-7-28 16:16

用 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, ... 由左上角開始,依順時針方向,圍一個正方形。
作者: none_and_none    時間: 2019-7-28 18:43

本帖最後由 none_and_none 於 2019-7-29 15:13 編輯

先由砌個array入手

[[1, 2, 3, 4],
[2, '', '', 5],
[1, '', '', 6],
[0, 9, 8, 7]]

arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[0][3] = 4

arr[1][3] = 5
arr[2][3] = 6

arr[3][3] = 7
arr[3][2] = 8
arr[3][1] = 9
arr[3][0] = 0

arr[2][0] = 1
arr[1][0] = 2

咁樣會唔會容易d諗到?
作者: bongbong3481    時間: 2019-7-28 19:04

回覆 1# haloPaul


好似是中學或大學的功課題目
作者: hihihi123hk    時間: 2019-7-29 10:20

1 2 3 4
2       5
1       6
0 9 8 7

輸入Size = 4 就會打印出以上的圖案
這條題目我思考了很久,可能是 ...
haloPaul 發表於 2019-7-28 14:55

唔好諗點 print 出黎

諗點砌個 Data structure 代表佢

然後再諗 print 個 data structure 出黎

via HKEPC IR Pro 3.5.1 - iOS(2.4.1)
作者: tse111    時間: 2019-7-29 11:45

一D難度都無
如#7先做一個NxN的陣列就可以
作者: Super169    時間: 2019-7-29 13:53

上下每行 n 個, 左右向 n  - 2  個數.  
Total 會顯示 4 n - 4 既數字, 每個以 x % 10 去顯示.
自己推算會個位係乜, 唔難吧.
第 1 行 由 1 至 n % 10
第 2 行, 左右係 (4n - 4)% 10, (n + 1) % 10
第 3 行, 左右係 (4n - 5)% 10, (n + 2) % 10
:
:
第 n 行, 由 (3n - 2) % 10  至  (2n - 1) % 10
作者: java2    時間: 2019-7-29 14:36

"我唯一的思路就只有先做上邊,然後右邊,再下邊,再左邊。" 呢個唔係你的思路而係功課要求.
除左第一列(由第二行開始)要諗下, 根本上冇難度

1 2 3 4
2       5
1       6
0 9 8 7

輸入Size = 4 就會打印出以上的圖案
這條題目我思考了很久,可能是 ...

我唯一的思路就只有先做上邊,然後右邊,再下邊,再左邊。

作者: super_hkg    時間: 2019-7-29 15:14

本帖最後由 super_hkg 於 2019-7-29 15:19 編輯

base case 係
1
第2個case 係
1 2
3 4
第三個case 係
1 2 3
8   4
7 6 5

用個number allocate memory 整個2D array

2D array + 4 個loop 填哂D 格 再印出黎,左上角永遠係"1"黎,其實只係4個差唔多既loop ,係搵返果格麻煩D
要諗下總共要填幾多個number ,幾多個係吉既

print 完free 返D memory

= = =
其實有個唔使用array 既方法,只需要計返最大個數再慢慢一行一行print 就得
作者: none_and_none    時間: 2019-7-29 15:21

arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[0][3] = 4

arr[1][3] = 5
arr[2][3] = 6

arr[3][3] = 7
arr[3][2] = 8
arr[3][1] = 9
arr[3][0] = 0

arr[2][0] = 1
arr[1][0] = 2
none_and_none 發表於 2019-7-28 18:43

可以見到array index係有pattern
然後就用四個loop順序去做上,右,下,左

點樣print個array出離,應該唔駛教啦掛
作者: 清仔    時間: 2019-7-29 16:40

Group N: x = x_left+1
1 2 3 4

Group E: x = x_bottom+1
5
6

Group S: x = x_right-1
0 9 8 7

Group W: x = x_bottom+1
2
1
作者: ckmakit    時間: 2019-7-29 17:37

2個while loop,
1個做加
1個做減
順時針咁assign value落2d array到
作者: a2462    時間: 2019-7-29 18:58

2個while loop,
1個做加
1個做減
順時針咁assign value落2d array到
ckmakit 發表於 2019-7-29 17:37



    真心唔難, 似功課多唔會放答案出o黎
呢位CHING已經比o左好大HINTS
作者: vichui    時間: 2019-7-29 22:46

Um.. 其實好易, 俾個tips 你
max_number = (size -1) * 4
有呢個連array 都唔洗用..
作者: 只是新手    時間: 2019-7-30 14:35

Um.. 其實好易, 俾個tips 你
max_number = (size -1) * 4
有呢個連array 都唔洗用..
vichui 發表於 2019-7-29 22:46



路過睇到你呢個答案應該係最簡單正解
作者: lionfish    時間: 2019-7-31 10:57

size=n; (i, j)=x where i, j=1 to n:

if i=1
    x=j %10;
else if i=n
    x=[(n-j+1) + n + (n-2)]%10;  // (3*n-j-1)%10
else if j=1
    x=[2*n + (n-2) + (n-i)]%10;  // (4*n-i-2)%10
else if j=n
    x=(n+i-1)%10;
else
   x=' ';

PS: % = Modulus
作者: headuck    時間: 2019-8-3 22:45

Python, 可以用 complex number 行一圈  
  1. def steps(size, dir = 1):
  2.     for _ in range(4):
  3.         for _ in range(size - 1): yield dir
  4.         dir *= -1j

  5. def square(size):
  6.     cmap = {}; idx = 0
  7.     for step in steps(size):
  8.         cmap[idx] = str((len(cmap) + 1) % 10)
  9.         idx += step
  10.     for j in range(size):
  11.         print ("".join([cmap.get(i-1j*j," ") for i in range(size)]))

  12. square(size=4)
複製代碼

作者: mamamear    時間: 2019-8-12 17:58

回覆 19# headuck


   
作者: 禁止進入    時間: 2019-8-15 14:39

本帖最後由 禁止進入 於 2019-8-18 16:45 編輯

Python
  1. def Square(size):
  2.         def gen_steps():
  3.                 a = 1
  4.                 b = ((size ** 2) - ((size - 2) ** 2)) % 10

  5.                 for i in range(1, 3 * size - 1):

  6.                         if i > size:
  7.                                 yield str(b)
  8.                                 b -= 1
  9.                                 if b < 0:
  10.                                         b = 9
  11.                         if i <= 2 * size - 2:
  12.                                 yield str(a)
  13.                                 a += 1
  14.                                 if a > 9:
  15.                                         a = 0

  16.         x = gen_steps()
  17.         output = [next(x) for _ in range(size)]
  18.         output += [ '\n{0}{1}{2}'.format(next(x), " " * (size - 2), next(x)) for i in range(size - 2)]
  19.         output += ['\n'] + [ next(x) for _ in range(size)]
  20.         
  21.         print(''.join(output))

  22. Square(5)
複製代碼

作者: carlkyo    時間: 2019-9-23 23:26

你講得唔清唔楚
可以點幫你姐如果係一個SEQ既問題, 咁應該提供埋打其他數字會係點既情況 ...
gakko 發表於 2019-7-28 15:36



    睇完即刻笑左
最直接既方法
諗都唔使諗
作者: ww9876    時間: 2019-9-23 23:45

俾我就開一個n*n嘅array。用最簡單的4個獨立for loop- top,right,bottom,left。 然后第5個for.loop 印result

via HKEPC Reader for Android
作者: dptinker    時間: 2019-9-25 10:09

  1. function print_number(x)
  2. {
  3.         var n=x;  //input number
  4.         var tmp = [];

  5.         var i=0;
  6.         var j=0;

  7.         for (i=0; i<n; i++)
  8.                 tmp[i] = [];
  9.                
  10.         i=0;

  11.         var v=1;

  12.         tmp[i][j] = v; //base case: size=1
  13.         j++;
  14.         v++;

  15.         while ((i!=0) || (j!=0 && j<n))        //if not returning to the starting point, loop it
  16.         {
  17.                 if ((i == 0) && (j<n-1))        //top edge
  18.                 {
  19.                         tmp[i][j] = v;
  20.                         j++;
  21.                 }
  22.                 else if ((j==n-1) && (i<n-1))        //right edge
  23.                 {
  24.                         tmp[i][j] = v;
  25.                         i++;
  26.                 }
  27.                 else if ((i==n-1) && (j>0))        //bottom edge
  28.                 {
  29.                         tmp[i][j] = v;
  30.                         j--;
  31.                 }
  32.                 else if ((j==0) && (i>0))        //left edge
  33.                 {
  34.                         tmp[i][j] = v;
  35.                         i--;
  36.                 }
  37.                
  38.                 //increment v
  39.                 if (v == 9)
  40.                         v = 0;
  41.                 else
  42.                         v++;
  43.         }

  44.         //output
  45.         var out_str;
  46.         for        (i=0; i<n; i++)
  47.         {
  48.                 out_str = "";
  49.                 for (j=0; j<n; j++)
  50.                 {
  51.                         if (i==0 || i==n-1 || j==0 || j==n-1)        //if it is the edge, print the value, else print a space
  52.                                 out_str += tmp[i][j];
  53.                         else
  54.                                 out_str += " ";
  55.                 }
  56.                 console.log(out_str);
  57.                
  58.         }
  59. };
複製代碼
Javascript, 可直接開chrome F12 去run, 簡單快捷

路過見到個post, 冇諗過數學pattern, 好直觀咁跟住4條邊順時針寫落個array 再output返出黎
都只係一個while loop就寫左落個array, 加一個nested for loop 黎output
睇返頭幾樓d ching 有point out 個pattern
跟返個pattern既話, 寫array 個loop 都可以慳返, 直接print d value出黎都仲得
作者: vichui    時間: 2019-9-25 10:38

  1. var size=4;
  2. var max_num = (size -1) * 4+1;

  3. for (r=0;r<size;r++){
  4.         var line="";
  5.         for (c=0;c<size;c++){
  6.                 if (r==0){
  7.                         line += (c+1)%10;
  8.                 }else if (r==size-1){
  9.                         line += (max_num - r -c)%10;
  10.                 }else{
  11.                         line = ((max_num - r)%10) + " ".repeat(size-2) + ((size+r)%10);
  12.                         break;
  13.                 }
  14.         }
  15.         console.log(line);

  16. }
複製代碼
Javascript, 可直接開chrome F12 去run, 簡單快捷

路過見到個post, 冇諗過數學pattern, 好直觀咁跟住4條邊 ...
dptinker 發表於 2019-9-25 10:09





歡迎光臨 電腦領域 HKEPC Hardware (https://h0.hkepc.com/forum/) Powered by Discuz! 7.2