帮我看看,为什么会少一种排列,要怎么改


#include <stdio.h>

using namespace std;
//问题表示
int n=3,r=3,k=0;    
void swap(int &a, int &b)    //交换两个元素
{
    int tmp=a;
    a=b; b=tmp;
}                                //全局变量
void disppath(int a[])            //输出一个组合
{    for (int j=0;j<r;j++)
        printf("  %d",a[j]);
    printf("\n");k++;
}
void dis(int a[],int i)
{
    
        disppath(a);
        for(int j=i+1;j<r;j++){
           swap(a[i],a[j]);
            dis(a,i+1);
            swap(a[i],a[j]);
        }         
        
}
void dfs(int a[],int i,int num)    //求解算法
{
    if (num==r)
        dis(a,0);
    for (int g=i;g<=n;g++)
    {
        a[num]=g;            //选择元素i
        dfs(a,g+1,num+1);        
        a[num]=g+1;            //回溯:不选择元素i
    }
}
int main()
{
int a[3];                //存放一个解
    printf("n=%d,r=%d的所有组合如下:\n",n,r);
    dfs(a,1,0);
    printf("一共有%d种组合",k); 
}

img

n和r代表什么,我的理解不止少一个,少了4个排列类型