BZOJ1259:[CQOI2007]矩形rect(DFS)
Description
给一个a*b矩形,由a*b个单位正方形组成。你需要沿着网格线把它分成分空的两部分,每部分所有格子连通,且至少有一个格子在原矩形的边界上。“连通”是指任两个格子都可以通过水平或者竖直路径连在一起。 求方案总数。例如3*2的矩形有15种方案。
Input
输入仅一行,为两个整数a,b。
1<=a<=6, 2<=b<=7
Output
输出仅一行,即方案总数。
Sample Input
3 2
Sample Output
15
Solution
爆搜分界线可过= =
亏我以为有什么神奇的规律还找了半天
Code
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 6 int dx[7]={0,1,0,-1,0},dy[7]={0,0,1,0,-1}; 7 int n,m,ans,vis[10][10]; 8 9 void Dfs(int x,int y) 10 { 11 if (x==0 || x==n || y==0 || y==m) ans++; 12 else 13 { 14 vis[x][y]=true; 15 for (int i=1; i<=4; ++i) 16 if (!vis[x+dx[i]][y+dy[i]]) 17 Dfs(x+dx[i],y+dy[i]); 18 vis[x][y]=false; 19 } 20 } 21 22 int main() 23 { 24 scanf("%d%d",&n,&m); 25 for (int i=1; i<n; ++i) 26 { 27 memset(vis,false,sizeof(vis)); 28 vis[i][0]=true; Dfs(i,1); 29 } 30 for (int i=1; i<m; ++i) 31 { 32 memset(vis,false,sizeof(vis)); 33 vis[0][i]=true; Dfs(1,i); 34 } 35 printf("%d\n",ans); 36 }