試計算: 包括這3種分法在內,一共有多少種不同的分割方法。 注意:旋轉對稱的屬於同一種分割法。
請提交該整數,不要填寫任何多餘的內容或說明文字。
第一次做的時候有點不理解中心對稱,查了一下
中心對稱是指把乙個圖形繞著某一點旋轉180°,如果它能夠與另乙個圖形重合,那麼就說這兩個圖形關於這個點對稱或中心對稱(central symmetry)。開始的思路是用dfs搜尋小方格的個數搜到18就停止,仔細分析後發現行不通,因為有時候有18個小格仔,兩個格仔並不相等。而且終止條件也不對,萬一沒搜到邊界就滿足18終止了,怎麼辦。於是調整思路,分割線將圖形分成完全相同,於是猜想這兩個圖形肯定是中心對稱的,這個分割線也是,看了一下示例發現還真是,這下就簡單了,從(3,3)開始兩條線往邊界走,由於旋轉對稱的屬於同一種分割法。所以往四周走是一樣的,我們可以只往乙個方向走。我們就往最下面走,
row==0&&col>0&&col<6
為終止條件,寫出**,
#include
using
namespace std;
int vis[7]
[7];
int dir[4]
[2]=
,,,}
;int cnt;
void
dfs(
int row,
int col)
if(row<=
0||row>=
6||col<=
0||col>=
6||vis[row]
[col]
)return
; vis[row]
[col]=1
; vis[
6-row][6
-col]=1
;for
(int i=
0;i<
4;i++
)dfs
(row+dir[i][0
],col+dir[i][1
]); vis[row]
[col]=0
; vis[
6-row][6
-col]=0
;}intmain()
上面這份**不太優雅,為了只到一遍需要一些不太直觀的條件,參考網友的部落格,最終為下面這樣,從中心出發,只要到達邊界結果就加1,總結果除以4即所得。
#include
using
namespace std;
int vis[7]
[7];
int dir[4]
[2]=
,,,}
;int cnt;
void
dfs(
int row,
int col)
if(row<
0||row>
6||col<
0||col>
6||vis[row]
[col]
)return
; vis[row]
[col]=1
; vis[
6-row][6
-col]=1
;for
(int i=
0;i<
4;i++
)dfs
(row+dir[i][0
],col+dir[i][1
]); vis[row]
[col]=0
; vis[
6-row][6
-col]=0
;}intmain()
參考:
中心對稱
第八屆藍橋杯 第四題方格分割
6x6的方格,沿著格仔的邊線剪開成兩部分。要求這兩部分的形狀完全相同。如圖 p1.png,p2.png,p3.png 就是可行的分割法。試計算 包括這3種分法在內,一共有多少種不同的分割方法。注意 旋轉對稱的屬於同一種分割法。請提交該整數,不要填寫任何多餘的內容或說明文字。說明 這道題用到的是深度優...
第八屆藍橋杯第四題方格分割
題目如下 6x6的方格,沿著格仔的邊線剪開成兩部分。要求這兩部分的形狀完全相同。如圖 p1.png,p2.png,p3.png 就是可行的分割法。試計算 包括這3種分法在內,一共有多少種不同的分割方法。注意 旋轉對稱的屬於同一種分割法。請提交該整數,不要填寫任何多餘的內容或說明文字。思路如下 從正方...
第八屆藍橋杯Java A組第四題方格分割題解
6x6的方格,沿著格仔的邊線剪開成兩部分。要求這兩部分的形狀完全相同。如圖 p1.png,p2.png,p3.png 就是可行的分割法。試計算 包括這3種分法在內,一共有多少種不同的分割方法。注意 旋轉對稱的屬於同一種分割法。題目思路 這道題確實看上去有點棘手,基本是用深搜的解法,但是深搜需要遍歷的...