迷宫问题(深搜+回溯)

来源:互联网 发布:美国新英格兰大学知乎 编辑:程序博客网 时间:2024/05/16 04:21

    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

30 0 00 1 11 0 0

Sample Output

2

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

#include<iostream>#include<cstring>#include<cstdio>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<n&&ny>=0&&ny<n&&s[nx][ny]==0&&a[nx][ny]==0)//前四个为判断是否在迷宫中  最后一个是判断该点是否被访问过        {            a[nx][ny]=1;            dfs(nx,ny);//是没访问过的点并且是可行点,就继续搜索            a[nx][ny]=0;//回溯,重新置为0,方便下次访问        }    }    return ;}int main(){    while(cin>>n)    {        sum=0;        memset(s,0,sizeof(s));        memset(a,0,sizeof(a));        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                cin>>s[i][j];        a[0][0]=1;//左上角访问过,置为1;        dfs(0,0);        printf("%d\n",sum);    }    return 0;}
       已AC。