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

Posted yuanweidao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",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;
}




































以上是关于ECJTU ACM18级队员寒假训练赛1 D题 HDU - 2181的主要内容,如果未能解决你的问题,请参考以下文章

ACM2016级新生第三周训练赛

2016级ACM寒假训练

2016级ACM寒假训练

第三届山西省赛1004 一道大水题(scanf)

2020劳动节训练赛

2018寒假 acm训练计划