#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)&&n){
int a[1000];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);//可以自行测试一下删除后的结果
do{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}while(next_permutation(a,a+n));
}
return 0;
}
题目表述
https://ac.nowcoder.com/acm/contest/9536/L
链接:https://ac.nowcoder.com/acm/contest/9536/L
有一个长度≤10且只包含大写字母的单词。我们在写作时不小心把它写错了,写错的单词与正确的单词中每种字母的个数相同,那么有多少种不同的写错的单词呢?
完整代码:
#include <bits/stdc++.h>
using namespace std;
int a[105];
int main(){
string s;
getline(cin,s);
int len=s.size();
for(int i=0;i<len;i++) a[i]=s[i];
int num=0;
sort(a,a+len);//!!!
while(next_permutation(a,a+len)){
num++;
}
cout<<num<<endl;
return 0;
}
题目表述:
https://ac.nowcoder.com/acm/contest/9707/G
三个三位数相加等于999 三个三位数从1~9选择不可以重复选择
完整代码:
#include <bits/stdc++.h>
using namespace std;
int a[10], num[4];
struct node
{
int num[4];
bool operator < (const node &a) const
{
if(num[1] != a.num[1]) return num[1] < a.num[1];
if(num[2] != a.num[2]) return num[2] < a.num[2];
return num[3] < a.num[3];
}
};
int main()
{
int i, j;
set<node> s;
for(i = 1; i <= 9; i++)
a[i] = i;
do
{
if((a[1] + a[4] + a[7]) * 100 + (a[2] + a[5] + a[8]) * 10 + a[3] + a[6] + a[9] == 999)
{
node tmp;
num[1] = a[1] * 100 + a[2] * 10 + a[3];
num[2] = a[4] * 100 + a[5] * 10 + a[6];
num[3] = a[7] * 100 + a[8] * 10 + a[9];
sort(num + 1, num + 4);
tmp.num[1] = num[1]; tmp.num[2] = num[2]; tmp.num[3] = num[3];
s.insert(tmp);//把符合的一组数字存入set容器
}
}while(next_permutation(a + 1, a + 10));//对数字1~9全排列
for(set<node> :: iterator it = s.begin(); it != s.end(); it++)// 迭代器读取每一组
{
cout<<it->num[1]<<" "<<it->num[2]<<" "<<it->num[3];
cout<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int p;
int a[10];
struct node
{
int a1,a2,a3;
bool operator < (const node &t) const
{
if(a1!= t.a1) return a1 < t.a1;
if(a2 != t.a2) return a2 < t.a2;
return a3 < t.a3;
}
};
node sv[100010];
int main()
{
for(int i = 1; i <= 9; i++)
a[i] = i;
do
{
int x = a[1] * 100 + a[2] * 10 + a[3];
int y = a[4] * 100 + a[5] * 10 + a[6];
int z = a[7] * 100 + a[8] * 10 + a[9];
if(x+y+z==999&&x<y&&y<z)
sv[++p]=(node){x,y,z};
}while(next_permutation(a + 1, a + 10));//对数字1~9全排列
sort(sv+1,sv+p);
for(int i=1;i<=p;i++){
printf("%d %d %d\n",sv[i].a1,sv[i].a2,sv[i].a3);
}
return 0;
}
题目表述:
https://ac.nowcoder.com/acm/contest/11471/B
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll s[10005];
int main(){
ios::sync_with_stdio(false);
ll n,k;
ll sum=0;
ll cnt=0;
cin>>n>>k;
for(ll i=0;i<n;i++){
s[i]=i;
sum=sum*10+s[i];
}
if(sum%k==0) cnt++;
while(next_permutation(s,s+n)){
sum=0;
for(ll i=0;i<n;i++) sum=sum*10+s[i];
if(sum%k==0) cnt++;
}
if(cnt) cout<<cnt<<endl;
else cout<<"-1";
return 0;
}
最后一题的题面:
群友们在玩一个游戏,共n个人在玩 每个人要在0-(n-1)中选一个数,注意每个数只能选择一次,
然后按照先后选择顺序拼成一个数,计算组成的数字是否可以整除k,
群友们想知道,如果选择方案不重复,最多有多少种情况可以整除k?
如果不可能整除k请输出-1;