第八屆藍橋杯方格分割深搜
阿新 • • 發佈:2019-01-27
標題:方格分割
6x6的方格,沿著格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同。
如圖:p1.png, p2.png, p3.png 就是可行的分割法。
試計算:
包括這3種分法在內,一共有多少種不同的分割方法。
注意:旋轉對稱的屬於同一種分割法。
6x6的方格,沿著格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同。
如圖:p1.png, p2.png, p3.png 就是可行的分割法。
試計算:
包括這3種分法在內,一共有多少種不同的分割方法。
注意:旋轉對稱的屬於同一種分割法。
請提交該整數,不要填寫任何多餘的內容或說明文字。
比賽的時候沒有做出來,因為當時一直想著同時深搜格子,但是深搜只能搜出一筆畫的格子,今天突然有了思路,
可以用分割格子的線來求,因為線也是關於(3,3)點對稱的,所以可以初始化從點(3,3)開始用深搜同時走對稱的兩條線。
因為旋轉對稱屬於同一種分法,所以求得的結果除以4即是答案
答案:509
#include<stdio.h> struct Point { int x; int y; }; int x[4]={-1,0,1,0},y[4]={0,1,0,-1}; int used[7][7]; int count=0; void dfs(Point p1,Point p2) { if(p1.x==0 || p1.y==6 || p1.y==0 || p1.x==6) { count++; return ; } int i; Point pp1,pp2; for(i=0;i<4;i++) { pp1.x=p1.x+x[i]; pp1.y=p1.y+y[i]; pp2.x=p2.x-x[i]; pp2.y=p2.y-y[i]; if(used[pp1.x][pp1.y]!=1) { used[pp1.x][pp1.y]=1; used[pp2.x][pp2.y]=1; dfs(pp1,pp2); used[pp1.x][pp1.y]=0; used[pp2.x][pp2.y]=0; } } } int main() { Point p; p.x=3; p.y=3; used[3][3]=1; dfs(p,p); printf("%d\n",count/4); return 0; }