Dili_iiii

编码全要靠底力

【dfs模板】找起点到终点的所有可能路径

题目描述

设有一个N*N(2≤N≤10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下图所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。

 

输入

第一行一个正整数N,表示N*N的迷宫。
接下来N行,为一个N*N矩阵。
 

 

输出

一行一个正整数,表示路径总数。
 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
int n;
int mp[105][105];
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
ll ant;
int vis[105][105];
bool check(int x,int y)
{
    if(x<1||x>n||y<1||y>n)
        return 1;
    if(vis[x][y]||mp[x][y])
        return 1;
    return 0;
}
/*void bfs()
{
    queue<node> qu;
    now.x=1,now.y=1;
    vis[now.x][now.y]=1;
    qu.push(now);
    while(!qu.empty())
    {
        now=qu.front();
        qu.pop();
        if(now.x==1&&now.y==n)
            ant++;
        for(int i=0;i<8;i++)
        {
            nex=now;
            nex.x+=dx[i];
            nex.y+=dy[i];
            if(check(nex.x,nex.y))
                continue;
            qu.push(nex);
        }
    }
}*/
void dfs(int x,int y)
{
    if(x==1&&y==n)
    {
        ant++;
        return;
    }
    for(int i=0;i<8;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(!check(nx,ny))
        {
            vis[nx][ny]=1;
            dfs(nx,ny);
            vis[nx][ny]=0;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&mp[i][j]);
        }
    }
    vis[1][1]=1;
    dfs(1,1);
    printf("%lld\n",ant);
    return 0;
}

 

posted @ 2019-01-22 19:54  Dili_iiii  阅读(919)  评论(0编辑  收藏  举报