问题标题: 酷町堂:3571 数字序列I 代码

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

3571   数字序列I

经验值:800 时间限制:1000毫秒

题目描述 Description

现在给定一个数字N(1<=N<=9),小H已经得到了序列A(序列A是由1到N一个排列),小H现在想知道比A序列字典序小一个的相同数字排列出的序列B是什么。

输入描述 Input Description

第一行一个整数N

第二行N个用空格隔开的整数,表示原定序列

输出描述 Output Description

前一个序列

样例输入 Sample Input

3 1 3 2

样例输出 Sample Output

1 2 3

数据范围及提示 Data Size & Hint

若当前排列已经是第一个,则输出’ERROR’(引号不输出)

 

 

//CODE
//#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[100];
int ans[100], t1;
int s[100];
bool used[10];
bool flag = true;
void dfs(int t) {
	if (t == n + 1) {
		for (int i = 1 ;i <= n; i ++) {
			if (ans[i] != a[i]) {
				flag = false;
			}
			s[i] = ans[i];
		}
		return ;
	}
	if (flag == true) {
		for (int i = 1; i <= n; i ++) {
			cout << s[i] << ' ';
		}
	}
	for (int i = 1; i <= n; i ++) {
		if (!used[i]) {
			ans[t] = i;
			used[i] = true;
			dfs(t + 1); 
			used[i] = false;
		}
	}
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	dfs(1);
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

 

张恩泽在2021-05-19 22:00:29追加了内容

改了一丢丢

//CODE
//#pragma GCC optimize(3)
//#include <bitsdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[100];
int ans[100], t1;
int s[100];
bool used[10];
bool flag = true;
void dfs(int t) {
	if (t == n + 1) {
		if (flag == true) {
			for (int i = 1; i <= n; i ++) {
				cout << s[i] << ' ';
			}
		}
		for (int i = 1 ;i <= n; i ++) {
			if (ans[i] != a[i]) {
				flag = false;
			}
			s[i] = ans[i];
		}
		return ;
	}
	for (int i = 1; i <= n; i ++) {
		if (!used[i]) {
			ans[t] = i;
			used[i] = true;
			dfs(t + 1); 
			used[i] = false;
		}
	}
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	dfs(1);
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

 

张恩泽在2021-05-20 12:23:35追加了内容
//CODE
//#pragma GCC optimize(3)
//#include <bitsdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[100];
int ans[100], t1;
int s[100];
bool used[10];
bool flag = true;
bool match() {
	for (int i = 1; i <= n; i ++) {
		if (a[i] != s[i]) {
			return false;
		}
	}
	return true;
}
void dfs(int t) {
	if (t == n + 1) {
		if (match() == true) {
			for (int i = 2; i <= n; i ++) {
				if (a[i] - 1 != a[i - 1]) {
					flag = true; 
				}
			}
			if (!flag) {
				cout << "ERROR";
			}
			for (int i = 1; i <= n; i ++) {
				cout << s[i] << ' ';
			}
			return ;
		}
		for (int i = 1; i <= n; i ++) {
			s[i] = a[i];
		}
		return ;
	}
	for (int i = 1; i <= n; i ++) {
		if (!used[i]) {
			ans[t] = i;
			used[i] = true;
			dfs(t + 1); 
			used[i] = false;
		}
	}
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	dfs(1);
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

 

张恩泽在2021-05-20 12:23:42追加了内容
//CODE
//#pragma GCC optimize(3)
//#include <bitsdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[100];
int ans[100], t1;
int s[100];
bool used[10];
bool flag = true;
bool match() {
	for (int i = 1; i <= n; i ++) {
		if (a[i] != s[i]) {
			return false;
		}
	}
	return true;
}
void dfs(int t) {
	if (t == n + 1) {
		if (match() == true) {
			for (int i = 2; i <= n; i ++) {
				if (a[i] - 1 != a[i - 1]) {
					flag = true; 
				}
			}
			if (!flag) {
				cout << "ERROR";
			}
			for (int i = 1; i <= n; i ++) {
				cout << s[i] << ' ';
			}
			return ;
		}
		for (int i = 1; i <= n; i ++) {
			s[i] = a[i];
		}
		return ;
	}
	for (int i = 1; i <= n; i ++) {
		if (!used[i]) {
			ans[t] = i;
			used[i] = true;
			dfs(t + 1); 
			used[i] = false;
		}
	}
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	dfs(1);
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

 


0
已采纳
汪恺恒
汪恺恒
中级启示者
中级启示者

STL不香吗

STL中的prev_permutation函数可以制造前一个排列,如果已经为第一个,则返回false。

代码很简单

if(prev_permutation(a+1,a+n+1)){
       for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
}       
else cout<<"ERROR";  

(其实这题还能用康托展开来做)

0
杜承俊
杜承俊
资深守护
资深守护

序列是第一个你没有判断

我要回答