Firetruck(dfs)

题目来源: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值