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 }
posted @ 2018-10-17 19:11  Refun  阅读(380)  评论(0编辑  收藏  举报