条条大路通罗马 - 华为笔试题目

条条大路通罗马 - 华为笔试题目_第1张图片

// 题目本身不难,就是一个深度优先搜索
// 但是-网上有一些博客给出的是错误答案
// 做这个深度优先搜索的关键问题,在于如何避免重新去节点,而不是去避免已经走过的路
// 在一次向下的深度搜索过程中,不能返回已经走过的节点
// 但是在完成一次到底的DFS后,在返回时必须重置 “走过”状态
// 1 -》 2 —》3
// 1-》4-》3 是两条一样的路径

#include  
#include  
#include 
using namespace std;  

int map[10][10];
int N,A,B;
int visited[10];  //用于记录已经走过的节点

int solve(int start,int end)
{
    int cnt = 0;
    visited[start] = 1;
    for(int i = 0; i< N; i++)
    {
        if( i == start)  // 不能从 a-》a
                continue;
        if( map[start][i] == 1 && visited[i] != 1)
        {

            if( i == end )  //抵达终点后,不继续向下搜索
                cnt++;
            else
            {
                map[start][i] = 0;
                cnt += solve(i,end);
                map[start][i] = 1;
            }
        }
    }
    visited[start] = 0;
    return cnt;
}


int main()  
{   

    while(cin>>N>>A>>B)
    {
        for(int i=0;ifor(int j=0;jcin>>map[i][j];    // CIN DATA  
            }   
        }
        memset(visited, 0 , 10*sizeof(int));
        cout<return 0;  
}  

你可能感兴趣的:(c/c++基础,编程练习)