1. 程式人生 > >ECJTU ACM18級隊員寒假訓練賽1 D題 HDU - 2181

ECJTU ACM18級隊員寒假訓練賽1 D題 HDU - 2181

set return string.h bool 註意 esp sca amp n-1

#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;
}

ECJTU ACM18級隊員寒假訓練賽1 D題 HDU - 2181