1. 程式人生 > >第八屆藍橋杯方格分割深搜

第八屆藍橋杯方格分割深搜

標題:方格分割
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;
}