深度优先搜索1

  1. #include<iostream>  //迷宫问题
  2. #include<cstring>  
  3. #include<cstdio>  
  4. using namespace std;  
  5. const int N=15,sx[8]={-1,-1,-1,0,0,1,1,1}  
  6.               ,sy[8]={-1,0,1,-1,1,-1,0,1};//八个方向标记做好  
  7. int n,sum=0;  
  8. int s[N][N],  
  9. a[N][N];//是否访问过标记  
  10. void  dfs(int x,int y)  
  11. {  
  12.     if(x==0&&y==n-1)  
  13.     {  
  14.         sum++;  
  15.         return ;  
  16.     }  
  17.     for(int i=0;i<8;i++)//依次访问该点周围八个方向  
  18.     {  
  19.         int nx=x+sx[i];  
  20.         int ny=y+sy[i];  
  21.         if(nx>=0&&nx<n&&ny>=0&&ny<n&&s[nx][ny]==0&&a[nx][ny]==0)//前四个为判断是否在迷宫中  最后一个是判断该点是否被访问过  
  22.         {  
  23.             a[nx][ny]=1;  
  24.             dfs(nx,ny);//是没访问过的点并且是可行点,就继续搜索  //递归
  25.             a[nx][ny]=0;//回溯,重新置为0,方便下次访问  
  26.         }  
  27.     }  
  28.     return ;  
  29. }  
  30.   
  31. int main()  
  32. {  
  33.     while(cin>>n)  
  34.     {  
  35.         sum=0;  
  36.         memset(s,0,sizeof(s));  
  37.         memset(a,0,sizeof(a));  
  38.         for(int i=0;i<n;i++)  
  39.             for(int j=0;j<n;j++)  
  40.                 cin>>s[i][j];  
  41.         a[0][0]=1;//左上角访问过,置为1;  
  42.         dfs(0,0);  
  43.         printf("%d\n",sum);  
  44.     }  
  45.     return 0;  
  46. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值