一路坑爹的题目.

一道坑爹的题目.....题目:从1--9中选取N个数字,组成不重复的N位数,从小到大进行编号,当输入其中任何一个数

一道坑爹的题目.....


  题目:从1--9中选取N个数字,组成不重复的N位数,从小到大进行编号,当输入其中任何一个数M时,能找出该数字对应  

  的编号。如N=3,M=213.
  输出:
  【123(1),132(2),213(3),231(4),312(5),321(6)】--->X=2.



  我首先用全排列做,行不通,输出的结果并不是严格按照从小到大的顺序输出的,如N=3,M=321时

  输出:【123(1),132(2),213(3),231(4),321(5),312(6)】--->X=5.

  这是错误的,我也找到了错误的根源,但不知道怎么解决。
   

  各路神仙有更好的方法没,当然也可以在我的这种方法上进行改进,不胜感激。




  我的代码如下,但输不出真确结果:

C/C++ code
#include<iostream>using namespace std;void f(int*a,int n,int m,int t,int &bz,int &bz1){    if(t==(n-1))    {        bz++;        int sum=0;        for(int i=0;i<n;i++)        {            cout<<a[i];            sum=sum*10+a[i];        }                cout<<"("<<bz<<")"<<",";        if(sum==m)        {            bz1=bz;        }        return;    }    else    {        for(int i=t;i<n;i++)        {            swap(a[t],a[i]);            f(a,n,m,t+1,bz,bz1);            swap(a[t],a[i]);        }    }}int main(){    int a[9];    int n;    cout<<"input N"<<endl;    cin>>n;    for(int i=0;i<n;i++)        a[i]=i+1;    int m;    cout<<"input M"<<endl;    cin>>m;    cout<<endl;    int bz=0,bz1=0;         cout<<"[";    f(a,n,m,0,bz,bz1);    cout<<"\b]----->X=";    cout<<bz1<<endl;    return 0;}



[解决办法]
C/C++ code
#include <iostream>using namespace std;void Swap(int* p1, int* p2){    int tmp = *p1; *p1 = *p2; *p2 = tmp;}void Reverse(int* start, int* end){    while (start < end)        Swap(start++, --end);}int NextPermutation(int* start, int* end){    int* p, *sp = end - 2;    if (start >= end - 1)        return 0;    while (sp >= start) {        if (sp[0] < sp[1])            break;        --sp;    }    if (sp < start) {        Reverse(start, end);        return 0;    }    for (p = end - 1; p > sp; --p)        if (*p > *sp) {            Swap(sp, p);            break;        }    Reverse(sp + 1, end);    return 1;}int cmp(int v, int* array, int n){    while (v) {        if (v % 10 != array[--n])            return 0;        v /= 10;    }    return 1;}int main(){    int n, m, x, array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };    cin >> n >> m;    for (x = 1; NextPermutation(array, array + n); ++x) {        if (cmp(m, array, n)) {            cout << x << endl;            break;        }    }}