这题debug了好久...
当n>=3的时候一直没输出,后来才发现是因为起始位置错了,下标可能是-1;
tips:没有输出的可能情况:爆范围(数组、指针地址)
描述
每一个人心中都有一个林克。每一个林克都不一样。在命运矩阵里面,随着选择的不同,没有哪一个林克的命运会一模一样。
有一个方格型的命运矩阵,矩阵边界在无穷远处。我们做如下假设:
1. 每一个格子象征林克命运中的一次抉择,每次只能从相邻的方格中做选择。
2. 从某个格子出发,只能从当前方格移动一格,走到某个相邻的方格上;
3.选择一旦做出就不可更改,因此走过的格子无法走第二次。
4. 从命运矩阵的第1行出发,只能向下、左、右三个方向走;
请问:如果最高允许在方格矩阵上走n步(也就是林克一生最多能做n个选择)。
那么随着n的不同,请问一共会有多少种不同选择的方案导致多少个不同的林克?
注意,2种走法只要有一步不一样,即被认为是不同的方案。
输入
允许在方格上行走的步数n(n <= 20)
输出
经过n个选择之后,诞生的不同的林克的个数。
输入样例 1
2
输出样例 1
7
输入样例 2
20
输出样例 2
54608393
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N = 85;
bool st[N][N];
int n;
int dx[] = {-1, 0, 1}, dy[] = {0, 1, 0}; //方向向量,可以省很多代码
LL dfs(int x, int y, int u){
if(u >= n) { //返回条件(最后一格没有继续往下的选择,方案数为1)
return 1;
}
LL res = 0; //用来统计当前格子往三个方向走的所有方案数
st[x][y] = true;
for(int i = 0; i < 3; ++ i){
int nx = x + dx[i], ny = y + dy[i]; //改值,可能去的地方
//cout << i << endl; //debug
if(!st[nx][ny]) res += dfs(nx, ny, u + 1); //没走过就能走
}
st[x][y] = false; //恢复现场(回溯)
return res;
}
int main(){
cin >> n;
cout << dfs(N/2, N/2, 0); //就是这里 起始位置要靠中间 在边界会溢出
return 0;
}