作者: 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
你講得唔清唔楚
可以點幫你姐

- int input;
- printf("Size=");
- scanf("%d", &input);
- if(input==4) { printf("1234\n2 5\n1 6\n0987"); }
作者: 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
唔好諗點 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
真心唔難, 似功課多
呢位CHING已經比o左好大HINTS

作者: vichui 時間: 2019-7-29 22:46
Um.. 其實好易, 俾個tips 你
max_number = (size -1) * 4
有呢個連array 都唔洗用..
作者: 只是新手 時間: 2019-7-30 14:35
路過睇到你呢個答案應該係最簡單正解
作者: 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 行一圈

- def steps(size, dir = 1):
- for _ in range(4):
- for _ in range(size - 1): yield dir
- dir *= -1j
- def square(size):
- cmap = {}; idx = 0
- for step in steps(size):
- cmap[idx] = str((len(cmap) + 1) % 10)
- idx += step
- for j in range(size):
- print ("".join([cmap.get(i-1j*j," ") for i in range(size)]))
- square(size=4)
作者: mamamear 時間: 2019-8-12 17:58
回覆 19# headuck
作者: 禁止進入 時間: 2019-8-15 14:39
本帖最後由 禁止進入 於 2019-8-18 16:45 編輯
Python
- def Square(size):
- def gen_steps():
- a = 1
- b = ((size ** 2) - ((size - 2) ** 2)) % 10
- for i in range(1, 3 * size - 1):
- if i > size:
- yield str(b)
- b -= 1
- if b < 0:
- b = 9
- if i <= 2 * size - 2:
- yield str(a)
- a += 1
- if a > 9:
- a = 0
- x = gen_steps()
- output = [next(x) for _ in range(size)]
- output += [ '\n{0}{1}{2}'.format(next(x), " " * (size - 2), next(x)) for i in range(size - 2)]
- output += ['\n'] + [ next(x) for _ in range(size)]
-
- print(''.join(output))
- Square(5)
作者: carlkyo 時間: 2019-9-23 23:26
睇完即刻笑左
最直接既方法
諗都唔使諗
作者: 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
- function print_number(x)
- {
- var n=x; //input number
- var tmp = [];
- var i=0;
- var j=0;
- for (i=0; i<n; i++)
- tmp[i] = [];
-
- i=0;
- var v=1;
- tmp[i][j] = v; //base case: size=1
- j++;
- v++;
- while ((i!=0) || (j!=0 && j<n)) //if not returning to the starting point, loop it
- {
- if ((i == 0) && (j<n-1)) //top edge
- {
- tmp[i][j] = v;
- j++;
- }
- else if ((j==n-1) && (i<n-1)) //right edge
- {
- tmp[i][j] = v;
- i++;
- }
- else if ((i==n-1) && (j>0)) //bottom edge
- {
- tmp[i][j] = v;
- j--;
- }
- else if ((j==0) && (i>0)) //left edge
- {
- tmp[i][j] = v;
- i--;
- }
-
- //increment v
- if (v == 9)
- v = 0;
- else
- v++;
- }
- //output
- var out_str;
- for (i=0; i<n; i++)
- {
- out_str = "";
- for (j=0; j<n; j++)
- {
- if (i==0 || i==n-1 || j==0 || j==n-1) //if it is the edge, print the value, else print a space
- out_str += tmp[i][j];
- else
- out_str += " ";
- }
- console.log(out_str);
-
- }
- };
路過見到個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
- var size=4;
- var max_num = (size -1) * 4+1;
- for (r=0;r<size;r++){
- var line="";
- for (c=0;c<size;c++){
- if (r==0){
- line += (c+1)%10;
- }else if (r==size-1){
- line += (max_num - r -c)%10;
- }else{
- line = ((max_num - r)%10) + " ".repeat(size-2) + ((size+r)%10);
- break;
- }
- }
- console.log(line);
- }

