题目描述
猩猩来到一个点(1,1),想吃右下角(N,N)的香蕉,规定只能往下走或者往右走,试问有多少种走法?
输入格式
第一行为一个整数N(N<=20)
以下是一个N*N的正方形表示迷宫
输出格式
仅有一个数,表示路径总数,如果走不通,则输出0
题解:———————————————————————————————————————————————————
本题有两种解法,第一种就是dfs,但我以身试法,有一个点不能过,超时!但对于新手来说,这种方法是不得不掌握的。
DFS代码实现:
#include<iostream>
using namespace std;
int total=0,n,map[21][21];
void dfs(int p,int q){
if(q==n&&p==n) {total++;return ;}
if(p+1<=n&&q<=n&&map[p+1][q]==0)
dfs(p+1,q);
if(q+1<=n&&p<=n&&map[p][q+1]==0)
dfs(p,q+1);
}
int main()
{
int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>map[i][j];
dfs(1,1);
cout<<total<<endl;
return 0;
}
解法二是递推,吧杨辉三角改改就行了。
代码实现:
#include<iostream>
using namespace std;
int n,map[21][21],f[21][21];
int main()
{
int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>map[i][j];
if(map[1][1]==1) {cout<<0<<endl;return 0;}
memset(f,0,sizeof(f));
f[1][1]=1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]!=1) if(i!=1||j!=1) f[i][j]=f[i-1][j]+f[i][j-1];
cout<<f[n][n]<<endl;
system("pause");
return 0;
}