標題:方格分割
6x6的方格,沿着格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同。
如圖:p1.png, p2.png, p3.png 就是可行的分割法。
試計算:
包括這3種分法在內,一共有多少種不同的分割方法。
注意:旋轉對稱的屬於同一種分割法。
請提交該整數,不要填寫任何多餘的內容或說明文字。
分析:當我們發現一道題用常規的方法很難解決時,就丟掉我們已經思考的思路,去開拓一種新的思路,尋找別的解決方案
此題如往常一樣去選格子,很顯然是非常難得一件事情,那我們不妨換一個思路,直接模仿剪刀的走向,爲了實現兩塊一樣的區域,我們可以用兩把剪刀從中間對稱的同時兩個方向剪,那怎麼模仿剪刀走向?還是回到DFS,怎麼同時剪?,我們搜一邊,同時標記對稱點即可。
#include<cstdio>
int mp[7][7];
bool vis[7][7];
int vir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};//四個方向
int cnt;
void dfs(int x,int y){
if(x==0||y==0||x==6||y==6){//剪到邊了
cnt++;
return ;
}
vis[x][y]=true;
vis[6-x][6-y]=true;//標記對稱點
for(int i=0;i<4;i++){
int tx=x+vir[i][0];
int ty=y+vir[i][1];
if(tx>=0&&tx<7&&ty>=0&&ty<7&&!vis[tx][ty]){
dfs(tx,ty);
}
}
vis[x][y]=false;
vis[6-x][6-y]=false;
}
int main(){
dfs(3,3);//從中間點開始搜素
printf("%d\n",cnt/4);//旋轉對稱屬於一個方法
return 0;
}