蓝桥杯-座次问题

1.题目

题目描述

小 A 的学校,老师好不容易解决了蓝桥杯的报名问题,现在老师又犯愁了。

现在有 N 位同学参加比赛,但是老师想给他们排座位,但是排列方式太多了。

老师非常想弄明白最后的排座次的结果是什么样子的,到底有多少种结果。

请设计一个程序帮助老师。

最后输出各种情况的人名即可,一行一种情况,每种情况的名字按照报名即输入顺序排序。

输入描述

输入第一行包含一个整数 N。

接下来 N 行每行包含一个字符串 Si ,表示人名。

1<=N<=10,i=1nSi∣<=102

输出描述

输出共若干行,每行输出各种情况的人名。一行一种情况,每种情况的名字按照报名即输入顺序排序。

输入输出样例

示例

输入
3
xiaowang
xiaoA
xiaoli
copy

输出
xiaowang xiaoA xiaoli
xiaowang xiaoli xiaoA
xiaoA xiaowang xiaoli
xiaoA xiaoli xiaowang
xiaoli xiaowang xiaoA
xiaoli xiaoA xiaowang

2. 题解

2.1 错误思路(使用next_permutation实现的全排列)

错误点

思路是对的,确实考的是全排列,但是这里next_permutation是按字节序排列,并非是按题目要求的输入顺序,导致错误

代码

#include<bits/stdc++.h>
using namespace std;

int factorial(int num){
	if (num == 1) return 1;
	return num * factorial(num - 1);
}

int main() {
	int n;
	cin >> n;
	vector<string> vec;
	for(int i = 0; i < n; i++) {
		string str;
		cin >> str;
		vec.push_back(str);
	}
	
	for(int i = 0; i < factorial(n); i++){
		for(string str : vec){
			cout << str << " ";
		}
		cout << endl;
		next_permutation(vec.begin(), vec.end());
	}
	return 0;
}

2.2 手动实现全排序(按输入顺序的)

思路

套用全排列模板即可

代码

#include<bits/stdc++.h>
using namespace std;
int n;
vector<string> vec;

string order[10]; 
bool chosen[10] = {false};

// x代表已选择了x-1个 
void DFS(int x){
	// 已选择完成 
	if(x == n) {
		for(int i = 0; i < n; i++){
			cout << order[i] << " ";
		}	
		cout << endl;
	}
	for(int i = 0; i < n; i++){
		// 该数已经被选择过了,则跳过 
		if (chosen[i]) continue;
		else{
			// 选择
			chosen[i] = true;
			order[x] = vec[i];
			DFS(x + 1); 
			// 不选择 
			chosen[i] = false;
			order[x] = "";
		}
	}
} 

int main() {
	cin >> n;
	for(int i = 0; i < n; i++) {
		string str;
		cin >> str;
		vec.push_back(str);
	}
	
	DFS(0);
	return 0;
}
posted @   DawnTraveler  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示