// 题目本身不难,就是一个深度优先搜索
// 但是-网上有一些博客给出的是错误答案
// 做这个深度优先搜索的关键问题,在于如何避免重新去节点,而不是去避免已经走过的路
// 在一次向下的深度搜索过程中,不能返回已经走过的节点
// 但是在完成一次到底的DFS后,在返回时必须重置 “走过”状态
// 1 -》 2 —》3
// 1-》4-》3 是两条一样的路径
#include<iostream>
#include<string>
#include <set>
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;i<N;i++)
{
for(int j=0;j<N;j++)
{
cin>>map[i][j]; // CIN DATA
}
}
memset(visited, 0 , 10*sizeof(int));
cout<<solve(A,B)<<endl;
}
return 0;
}
条条大路通罗马 - 华为笔试题目
最新推荐文章于 2022-04-14 18:08:58 发布