一路坑爹的题目.
一道坑爹的题目.....
题目:从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.
这是错误的,我也找到了错误的根源,但不知道怎么解决。
各路神仙有更好的方法没,当然也可以在我的这种方法上进行改进,不胜感激。
我的代码如下,但输不出真确结果:
------解决方案--------------------
题目:从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; } } }