![](https://images2015.cnblogs.com/blog/829161/201605/829161-20160504082347185-1572931517.png)
先搜索 出来一点结果之后 看结果之间的 联系 得出 递推公式 .
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<limits.h>
6 #include<algorithm>
7 #include<queue>
8 #include<vector>
9 #include<set>
10 #include<stack>
11 #include<string>
12 #include<sstream>
13 #include<map>
14 #include<cctype>
15 using namespace std;
16 int visited[60],result[60],flag,n;
17 void DFS(int mark)
18 {
19 if(mark==n)
20 flag++;
21 else
22 {
23 for(int i=2;i<=n;i++)
24 {
25 if(abs(i-result[mark])<=2&&!visited[i])
26 {
27 result[mark+1]=i;
28 visited[i]=1;
29 DFS(mark+1);
30 visited[i]=0;
31 }
32 }
33 }
34 }
35 int main()
36 {
37 while(scanf("%d",&n)!=EOF)
38 {
39 memset(visited,0,sizeof(visited));
40 visited[1]=result[1]=1;
41 flag=0;
42 DFS(1);
43 printf("%d
",flag);
44 }
45 return 0;
46 }
可以通过一些 结果推出来 递推公式
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<limits.h>
6 #include<algorithm>
7 #include<queue>
8 #include<vector>
9 #include<set>
10 #include<stack>
11 #include<string>
12 #include<sstream>
13 #include<map>
14 #include<cctype>
15 using namespace std;
16 int main()
17 {
18 int n,ac[57]={0,1,1,2};
19 for(int i=4;i<=55;i++)
20 ac[i]=ac[i-1]+ac[i-3]+1;
21 while(~scanf("%d",&n))
22 {
23 printf("%d
",ac[n]);
24 }
25 return 0;
26 }
27