题目:迷宫路径

题目描述

猩猩来到一个点(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;
   
    }

原文地址:https://www.cnblogs.com/noip/p/2290776.html