题目来源:1991 ACM Final,Problem A,Firetruck(UVa 208)
题意:给定目标街口,问从街口1到目标街口路径条数并打印出路径。(最多20个街口)
思路:本题是典型的路径搜索问题,搜索从位置1开始。依次将搜索到的街口编号放入路径path中。如果搜索到目标街口,那么本次搜索结束,并输出该路径,可达路径数增加1。如果没有到达目标街口,那么判断当前可到达的街口,是否出现在先前的那段路径中,若出现,则放弃,否则,加入路径。
代码:
int sum,aim;//路径条数,目标街口
int path[22];//保存路径
int street[22][22];//街道图,双向的
void dfs(int pos,int path[],int index)
{
if(pos==aim)
{
sum++;
for(int i=0;i<index;i++)
cout<<path[i];
cout<<endl;
}
for(int i=1;i<22;i++)
{
if(street[pos][i])
{
int j;
for(j=0;j<index;j++)//查看街口是否已经在路径path上出现过
if(path[j]==i) break;//如果出现过,放弃
if(j==index)
{
path[index]=i;
dfs(i,path,index+1);
}
}
}
}
int main()
{
/*输入略*/
memset(street,0,sizeof(street));
street[u][v]=street[v][u]=1;
path[0]=1;
sum=0;
dfs(1,path,1);
/*...*/
return 0;
}