深搜题,只能向右和向下移动,预先设定终点坐标(n-1,n-1),注意使用 __int64 存储路径数。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 40;
char mp[MAXN][MAXN]; //地图
int vis[MAXN][MAXN]; //访问情况
__int64 dp[MAXN][MAXN]; //路径数,dp[i][j]表示从点(i,j)到终点的路径数
const int nx[] = { 0,1 }; //x轴移动
const int ny[] = { 1,0 }; //y轴移动
int n;
//深搜,搜索从点(x,y)到终点的路径数
__int64 DFS(int x, int y)
{
if (x < 0 || x > n - 1 || y < 0 || y > n - 1)
return 0;
if (vis[x][y])
return dp[x][y];
vis[x][y] = 1;
for (int i = 0; i < 2; i++)
dp[x][y] += DFS(x + (mp[x][y] - '0') * nx[i], y + (mp[x][y] - '0') * ny[i]);
return dp[x][y];
}
int main()
{
while (cin >> n)
{
if (n == -1)
break;
for (int i = 0; i < n; i++)
{
cin >> mp[i];
}
memset(vis, 0, sizeof(vis));
memset(dp, 0, sizeof(dp));
vis[n - 1][n - 1] = 1;
dp[n - 1][n - 1] = 1; //终点设为(n-1,n-1)
cout << DFS(0, 0) << endl;
}
return 0;
}
继续加油。