• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
nuoyananman
博客园    首页    新随笔    联系   管理    订阅  订阅

数字全排列 C++

小明负责公司年会,想出一个趣味游戏: 屏幕给出1~9中任意3个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出的数字中最大的(如果不到这么多个数字则给出最后一个即可)。

注意: 1)2可以当做5来使用,5也可以当做2来使用进行数字拼接,且屏幕不能同时给出2和5;

           2)6可以当做9来使用,9也可以当做6来使用进行数字拼接,且屏幕不能同时给出6和9。  

如给出:1,4,8,则可以拼成的数字为: 1,4,8,14,18,41,48,81,84,148,184,418,481,814,841 那么最第N(即8)个的数字为81。

输入描述: 输入为以逗号分隔的描述3个int类型整数的字符串。

输出描述: 输出为这几个数字可拼成的数字从小到大排列位于第N(N为输入数字中最大的数字)位置的数字,如果输入的数字不在范围内或者有重复,则输出-1。

示例1 输入 1,4,8 输出 81 说明 可以构成的数字按从小到大排序为1,4,8,14,18,41,48,81,84,148,184,418,481,814,841,故第8个为81

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;;
vector<int> shu; string k = ""; int m;
void yi(string a) 
{
	for (int i = 0; i < 3; ++i)
	{ 
		m = a[i] - '0';
		if(find(begin(shu),end(shu),m)==end(shu))
		shu.push_back(m);
	}
}
void er(string a)
{
	char c;
	for(int i=0;i<3;++i)
	{
		k = "";
		for (int j = 0; j < 3; ++j)if (i != j)k += a[j];
		m = stoi(k);
		if (find(begin(shu), end(shu), m) == end(shu))
		{
		shu.push_back(stoi(k));
		c = k[0]; k[0] = k[1]; k[1] = c;
		shu.push_back(stoi(k));	
		}
	}
}
void san(string a)
{
	shu.push_back(stoi(a));
	while(next_permutation(begin(a),end(a)))
	{
		shu.push_back(stoi(a));
	}
}
void math(string a)
{
	sort(begin(a), end(a));
	yi(a); er(a); san(a);//事实上不需要调用函数san,因为n最大为9,第9位数字必是二位数;
}
int main() 
{
	string a = ""; char n; string x; char c; string w,ss;
	while (scanf("%c", &n)) 
	{

		if (n == '2' || n == '6')n = n + 3;
		if(n>'9'||n<'0'||find(begin(a),end(a),n)!=end(a))
		{
			printf("-1"); return 0;
		}
		a+=n;
		c = getchar();
		if (c == '\n')break;
	}
    sort(begin(a), end(a));
	w = a; ss = a;
	for(int i=0;i<size(a);++i)
	{
		if (a[i] == '5'|| a[i] == '9')
		{
			w[i] = a[i]-3; math(w);
		}
	}
	for (int i = 0; i < size(a); ++i)
	{
		if (a[i] == '9')
		{
			ss[i] = a[i] - 3;
			if (ss != w)math(ss);
		}
	}
	math(a);
	sort(begin(shu), end(shu));
	for (int i = 0; i < shu.size(); ++i)cout << shu[i] << "    ";cout << endl;//输出所有排列数,可去掉此行;
	cout << shu[a[2]-'0'-1] << endl;
	return 0;
}

 

posted @ 2022-03-24 10:44  南蛮入侵  阅读(487)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3