标题:格子刷油漆
X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如图所示),现需要把这些格子刷上保护漆。
你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
比如:a d b c e f 就是合格的刷漆顺序。
c e f d a b 是另一种合适的方案。
当已知 N 时,求总的方案数。当N较大时,结果会迅速增大,请把结果对 1000000007 (十亿零七) 取模。
输入数据为一个正整数(不大于1000)
输出数据为一个正整数。
例如:
用户输入:
2
程序应该输出:
24
再例如:
用户输入:
3
程序应该输出:
96
再例如:
用户输入:
22
程序应该输出:
359635897
代码无用的dfs,等看懂了大佬的DP再加上吧- -
// 格子刷油漆#include <bits/stdc++.h>usingnamespacestd;
int N, M;
int *an[2];
int *vis[2];
long res(0);
int pos[8][2] = {{1,0},{-1,0},{0,-1},{0,1},{1,-1},{1,1},{-1,-1},{-1,1}};
void init()
{
cin >> N;
M = N*2;
for(int i=0; i<2; ++i) {
an[i] = newint[N];
vis[i] = newint[N];
memset(an[i],0,sizeof(int)*N);
memcpy(vis[i],an[i],sizeof(int)*N);
}
}
void dfs(int m, int i, int j)
{
if(i<0||i>=2||j<0||j>=N) return;
if(m==0) {
return ;
} else {
if(!vis[i][j]) {
vis[i][j] = 1;
if(m==1) {
res += 1;
res %= 1000000007;
}
for(int k=0; k<8; ++k) {
int xi = i+pos[k][0], xj = j+pos[k][1];
dfs(m-1,xi,xj);
}
vis[i][j] = 0;
}
}
}
int main()
{
init();
for(int i=0; i<2; ++i) {
for(int j=0; j<N; ++j) {
dfs(M,i,j);
}
}
cout << res << endl;
return0;
}