题目描述
已知下列各点之间的通向问题,请打印出由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);//函数
}