迷宫问题(深搜+回溯)

    Time Limit: 1 Sec  Memory Limit:128 MB  64bit IO Format: %lld
                                 [Submit][Status][Web Board]

设有一个N*N(2<=N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。

Input

第一行一个正整数N;

接下来的包含N行,每行N个数。用来描述迷宫。

Output

输出路径总数。

Sample Input

3
0 0 0
0 1 1
1 0 0

Sample Output

2

  这类问题重点在于访问过的点又可能还要再次访问,所以用dfs加简单回溯就可以了。

#include
#include
#include
using namespace std;
const int N=15,sx[8]={-1,-1,-1,0,0,1,1,1}
              ,sy[8]={-1,0,1,-1,1,-1,0,1};//八个方向标记做好
int n,sum=0;
int s[N][N],
a[N][N];//是否访问过标记
void  dfs(int x,int y)
{
    if(x==0&&y==n-1)
    {
        sum++;
        return ;
    }
    for(int i=0;i<8;i++)//依次访问该点周围八个方向
    {
        int nx=x+sx[i];
        int ny=y+sy[i];
        if(nx>=0&&nx=0&&ny>n)
    {
        sum=0;
        memset(s,0,sizeof(s));
        memset(a,0,sizeof(a));
        for(int i=0;i>s[i][j];
        a[0][0]=1;//左上角访问过,置为1;
        dfs(0,0);
        printf("%d\n",sum);
    }
    return 0;
}
       已AC。

你可能感兴趣的:(ACM__DFS)