ECJTU ACM18级队员寒假训练赛1 D题 HDU - 2181

#include<stdio.h>
#include<string.h>
using namespace std;

int map[25][4],path[25]; //map数组建立联系,path数组储存路径
int m,k=1;
bool vis[25];// 标记数组

void dfs(int cur,int step) //cur当前所在的顶点, step当前所走的路径
{
vis[cur]=1;
path[step]=cur; //储存
for(int i=0;i<3;i++)
{
int x=map[cur][i];
if(x==m&&step==19) //若下一步(即当前步数为19步,因为20个顶点走到了第19个)满足到达起点 ,则输出储存的路径
{
printf("%d: ",k++);
for(int j=0;j<20;j++)
printf("%d ",path[j]);
printf("%d\n",m);
}
if(!vis[x]) //若下一步不能到达终点并且下一个点没有被访问,访问下一个点 ,步数+1
dfs(x,step+1);
}
vis[cur]=0; //这里很难理解, 可以跟上面的vis[cur]=1,当做一个整体来理解,一个完整的dfs结束后将标记变为0,才可以回溯上来找其他到达终点的路径
}

int main()
{
for(int i=1;i<=20;i++)
scanf("%d%d%d",&map[i][0],&map[i][1],&map[i][2]); //题意1~20个顶点 注意不要for(0~n-1)
while(scanf("%d",&m)!=EOF)
{
if(m==0)
break; //跳出
memset(vis,0,sizeof(vis));
memset(path,0,sizeof(path)); //初始化
dfs(m,0); //以起点和深入步数dfs
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/yuanweidao/p/10296201.html