切換
舊版
前往
大廳
主題

ZeroJudge - c708: 11538 - Chess Queen 解題心得

Not In My Back Yard | 2018-09-14 23:11:22 | 巴幣 0 | 人氣 286

題目連結:

題目大意:
給定N、M(N、M皆小於等於10 ^ 6),代表有一N * M的棋盤。求在棋盤上擺放兩個相異的皇后(西洋棋的皇后可以走對角線或直線上的任何一格),使得兩皇后彼此能互相攻擊的方法數。

N=M=0時,停止程式。

解題思維:
答案是有數學解的,公式可以從以下推導:

我們定義其中一個皇后叫做Q1,另一個叫做Q2,且假設以下N ≦ M。

直線的方面很簡單。Q1(或Q2,不影響)從棋盤上便挑一格,Q2挑Q1所在的直線方向剩下的格數(畢竟不能放在同一格)。因此直線方向的方法數為:
N * M * (N + M - 2)

而對角線的方面可以由畫圖觀察到,最長的長度為N並有(M - N + 1)* 2條。其餘長度從2~N-1都各有四條。所以對角線方向的方法數為:
2 *(M - N + 1)* N * (N - 1)+
4[2 * 1+3 * 2+……+(N - 1)*(N - 2)]
簡化一下便變成了
2 *[2 * N *(N-1)*(N-2)/ 3+(M - N + 1)* N *(N-1)]

而直線方向+對角線方向便是所求。


此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

胖胖貓
對角線的公式:2 *[N *(N-1)*(N-2)/ 3+(M - N + 1)* N *(N-1)]
要改成:2 *[2 * N *(N-1)*(N-2)/ 3+(M - N + 1)* N *(N-1)]
少個 2喔
2018-11-19 23:25:14
Not In My Back Yard
感謝大大的提醒。

話說,大大是ZJ上同名的那位大大嗎?XD
2018-11-19 23:47:18
胖胖貓
Y,我一編寫題目邊編列教材給程式家教的學生,所以就瞎人摸象,看大家都在寫什麼就一起寫
不過本身不是競技程式出身,寫起來頗吃力> <。
2018-11-19 23:59:41
Not In My Back Yard
辛苦了,希望可以再和大大一同交流XD
2018-11-20 00:20:31

更多創作