题目
思路
额,其实仔细研究就会发现只要确定了分割的方法(分割线)那么结果就已经确定了,那么我们要枚举起点,而且只需要枚举2条边,当然,这是因为从另一边开始搜索显然一定是与前2边重复的。
使用此方法可ACP4537
code:
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,q[4][2]={
{
0,1},{
1,0},{
-1,0},{
0,-1}},s;
bool a[10][10];
void dfs(int x,int y)
{
a[x][y]=1;
if (x==0||y==0||x==n||y==m)
{
s++;
a[x][y]=0;
return;
}
for (int i=0;i<4;i++)
{
int dx=x+q[i][0],dy=y+q[i][1];
if (dx>=0&&dy>=0&&dx<=n&&dy<=m&&!a[dx][dy]) dfs(dx,dy);
}
a[x][y]=0;
return;
}
int main()
{
cin>>n>>m;
for (int i=1;i<n;i++)
{
a[i][0]=1;
dfs(i,1);
a[i][0]=0;
}
for (int i=1;i<m;i++)
{
a[0][i]=1;
dfs(1,i);
a[0][i]=0;
}
cout<<s;
return 0;
}