1064. 【递归算法】路径问题

题目描述

已知下列各点之间的通向问题,请打印出由1至N(由键盘输入)的所有走法。例如当n=10的时候,路径图如下所示。


当n=4的时候,路径图如下所示:

输入

输入正整数n(n<=10)

输出

一行,第一个整数表示第几种情况,空一格,接下来用'整数>'的方式列出路径

样例输入 
4
样例输出 
1 1>2>3>4
2 1>2>4
3 1>3>4
#include<bits/stdc++.h>//头文件 
using namespace std;
int n,a[10000000],s[1000000],ans;//分别代表点数,可能的结果,数列,总方法数 
void q(int x,int y)//函数代表a的第x项&&s的第y项 
{
    //选后面第一个 
    a[x]=s[y];//选择过去 
    if(a[x]==n)//如果是最后一个就输出 
    {
        printf("%d ",++ans);//前面的数字 
        for(int i=1;i<=x-1;i++)printf("%d>",a[i]);//输出个数-1个(因为还要输出“>”) 
        printf("%d\n",a[x]);//输出最后一个和换行符 
        x=y=1;//重置(回溯) 
        return;//返回 
    }
    q(x+1,y+1);//存储位置向后一位,选后面第一个 (递归) 
    
    //选后面第二个 
    if(y+2>n)return;//判断是否会超出(例如:(n=4)已选到3,就不能 选后面第二个 ) 
    a[x]=s[y];//选择过去
    if(a[x]==n)//如果是最后一个就输出
    {
        printf("%d ",++ans);//前面的数字
        for(int i=1;i<=x-1;i++)printf("%d>",a[i]);//输出个数-1个(因为还要输出“>”)
        printf("%d\n",a[x]);//输出最后一个和换行符 
        x=y=1;//重置(回溯)
        return;//返回 
    }
    q(x+1,y+2);//存储位置向后一位,选后面第二个 (递归) 
}
int main()//主函数 
{
    cin>>n;//输入 
    for(int i=1;i<=n;i++)s[i]=i;//赋值 
    q(1,1);//函数 
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值