暴力求解取数排序

题目描述

取1到N共N个连续的数字(1≤N≤9),组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号。当输入一个编号M时,就能打印出与该编号对应的那个N位数。例如,当N=3时,可组成的所有三位数为:123,132,213,231,312,321
那么,输入编号M=2时,则输出132。

输入

包括两个数,即正整数N(1 <= N <= 9)和正整数M(1 <= M <= 362880)。

输出

只有一行,即与输入的编号M对应的那个N位数。

代码(此为暴力求解,只适合时间复杂度小的答案)

#include<iostream>
#include<string>
using namespace std;

string aarr[370000];



int main()
{
	int cishu;
	int weishu;
	cin >> cishu >> weishu;
	int i = 1;
	string str = "";
	for (int a = 1; a <= cishu&&cishu >= 1; a++)
	{
		if ((i) == weishu+1) break;
		if (cishu == 1) {
			str += to_string(a);
			aarr[i++] = str;
			str = "";
		}
		for (int b = 1; b <= cishu && cishu >= 2; b++)
		{
			if ((i) == weishu+1) break;
			if (b == a) continue;
			if (cishu == 2) {
				str += to_string(a)+ to_string(b);
				aarr[i++] = str;
				str = "";
			}
			for (int c = 1; c <= cishu && cishu >= 3; c++)
			{
				if ((i) == weishu+1) break;
				if (c == b||c==a) continue;
				if (cishu == 3) {
					str += to_string(a) + to_string(b) + to_string(c);
					aarr[i++] = str;
					str = "";
				}
				for (int d = 1; d <= cishu && cishu >= 4; d++)
				{
					if ((i) == weishu+1) break;
					if (d == b || d == a||d==c) continue;
					if (cishu == 4) {
						str += to_string(a) + to_string(b) + to_string(c)+ to_string(d);
						aarr[i++] = str;
						str = "";
					}
					for (int e = 1; e <= cishu && cishu >= 5; e++)
					{
						if ((i) == weishu+1) break;
						if (e == b || e == a || e == c||e==d) continue;
						if (cishu == 5) {
							str += to_string(a) + to_string(b) + to_string(c) + to_string(d)+ to_string(e);
							aarr[i++] = str;
							str = "";
						}
						for (int f = 1; f <= cishu && cishu >= 6; f++)
						{
							if ((i) == weishu+1) break;
							if (f == b || f == a || f == c || f == d||f==e) continue;
							if (cishu == 6) {
								str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e)+ to_string(f);
								aarr[i++] = str;
								str = "";
							}
							for (int g = 1; g <= cishu && cishu >= 7; g++)
							{
								if ((i) == weishu+1) break;
								if (g == b || g == a || g == c || g == d || g == e||g==f) continue;
								if (cishu == 7) {
									str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e) + to_string(f)+ to_string(g);
									aarr[i++] = str;
									str = "";
								}
								for (int h = 1; h <= cishu && cishu >= 8; h++)
								{
									if ((i) == weishu+1) break;
									if (h == b || h == a || h == c || h == d || h == e || h == f||h==g) continue;
									if (cishu == 8) {
										str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e) + to_string(f) + to_string(g)+ to_string(h);
										aarr[i++] = str;
										str = "";
									}
									for (int ii = 1; ii <= cishu && cishu >= 9; ii++)
									{
										if ((i) == weishu+1) break;
										if (ii == b || ii == a || ii == c || ii == d || ii == e || ii == f || ii == g||ii==h) continue;
										if (cishu == 9) {
											str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e) + to_string(f) + to_string(g) + to_string(h)+ to_string(ii);
											aarr[i++] = str;
											str = "";
										}
									}
								}
							}
						}
					}
				}
			}
			
		}
	}
	cout << aarr[weishu];
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值