| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 989 人关注过本帖
标题:学习dfs递归回溯碰到一个好奇怪的问题,大家来帮忙看看
取消只看楼主 加入收藏
guheihei
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2022-1-21
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
学习dfs递归回溯碰到一个好奇怪的问题,大家来帮忙看看
楼主在用C++学习深度搜索回溯,碰到了一个好奇怪的问题,先附上代码再描述问题
程序代码:
#include<bits/stdc++.h>
using namespace std;

bool yg[7];
//yg = 用过  用来判断的

void dfs(int x)
{
yg[x] = 1;//每来一次就先占了他  后面再释放

switch(x) {
    case 1:
           if(!yg[2]){
               cout<<"2  J"<<x<<endl;//J=叫他进的数          
               dfs(2) ;                 
           }
           if(!yg[4]){
               cout<<"4  J"<<x<<endl;                     
               dfs(4) ;                 
           }
         
    case 2:
            if(!yg[3]){
            cout<<"3  J"<<x<<endl;                       
               dfs(3) ;                 
           }
            if(!yg[7]){
            cout<<"7  J"<<x<<endl;                       
               dfs(7) ;                 
           }

    case 3:
           if(!yg[4]){
               cout<<"4  J"<<x<<endl;                     
               dfs(4) ;                 
           }
          if(!yg[5]){
              cout<<"5  J"<<x<<endl;                   
               dfs(5) ;                 
           }
           if(!yg[7]){
               cout<<"7  J"<<x<<endl;                     
               dfs(7) ;                 
           }                
    case 4:  if(!yg[5]){
           cout<<"5  J"<<x<<endl;    
               dfs(5) ;                 
           }
               if(!yg[3]){
            cout<<"3  J"<<x<<endl;                                  
               dfs(3) ;                 
           }        
    case 5: 
//问题也在这里
          if(!yg[6]){
             cout<<"6  J"<<x<<endl;           
               dfs(6) ;                 
           } 
            if(!yg[4]){
            cout<<"4  J"<<x<<endl;                       
               dfs(4) ;                 
           } 
            if(!yg[3]){
            cout<<"3  J"<<x<<endl;                       
               dfs(3) ;                 
           } 
    case 6:
             if(!yg[5]){
             cout<<"5  J"<<x<<endl;                         
               dfs(5) ;                 
           } 
                              
               if(!yg[7]){
              cout<<"7  J"<<x<<endl;                              
               dfs(7) ;                 
           }    
    case 7:
            if(!yg[6]){
            cout<<"6  J"<<x<<endl;                       
               dfs(6) ;                 
           }
           if(!yg[3]){
               cout<<"3  J"<<x<<endl;                     
               dfs(3) ;                 
           } 
           if(!yg[2]){
               cout<<"2  J"<<x<<endl;                 
               dfs(2) ;                 
           }                                                          
}
yg[x] = 0;//这次用完了 释放
cout<<x<<"t"<<endl;//t表示退出  即x退出了
}
int main(){
   dfs(1) ; 
   }

以上代码运行后输出如下(截取部分)
2  J1
3  J2
4  J3
5  J4
6  J5
7  J6
7t
6t
7  J5

问题再最后一句“7  J5”,  他表示将进入dfs(7),并且是当前在x=5的时候进入的,但是所写代码里面判断当x=5的时候我并没有让他进入dfs(7),那么他这句输出为什么会这样?结合代码跑一遍,不是应该继续退到上一个x吗?

关于这段switch没有加break,
是的
我是想让他在当前情况继续判断下去

也就是说当他回溯之后,继续根据x的情况判断下去 (比如x=5,他还会根据条件情况进入dfs(6)/dfs(4)/dfs(3),如果都不符合条件才跳到末尾结束当前一轮的switch)


按照本例代码运行的理论走势,他应该是退到x=3的情况,然后进入dfs(5)

但他实际情况并不是这样..   不知道为什么


[此贴子已经被作者于2022-1-21 14:47编辑过]

搜索更多相关主题的帖子: cout 学习 case 代码 回溯 
2022-01-21 14:26
快速回复:学习dfs递归回溯碰到一个好奇怪的问题,大家来帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018411 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved