蓝桥杯几道全排列的题目
【摘要】 方格填数#include<bits/stdc++.h>using namespace std;bool check(vector<int>arr){ if( abs(arr[0]-arr[1])==1|| abs(arr[0]-arr[3])==1|| abs(arr[0]-arr[4])==1|| abs(arr[0]-arr[5])==1|| abs(arr[1]-arr...
方格填数
#include<bits/stdc++.h>
using namespace std;
bool check(vector<int>arr){
if(
abs(arr[0]-arr[1])==1||
abs(arr[0]-arr[3])==1||
abs(arr[0]-arr[4])==1||
abs(arr[0]-arr[5])==1||
abs(arr[1]-arr[2])==1||
abs(arr[1]-arr[4])==1||
abs(arr[1]-arr[5])==1||
abs(arr[1]-arr[6])==1||
abs(arr[2]-arr[5])==1||
abs(arr[2]-arr[6])==1||
abs(arr[3]-arr[4])==1||
abs(arr[3]-arr[7])==1||
abs(arr[3]-arr[8])==1||
abs(arr[4]-arr[5])==1||
abs(arr[4]-arr[7])==1||
abs(arr[4]-arr[8])==1||
abs(arr[4]-arr[9])==1||
abs(arr[5]-arr[6])==1||
abs(arr[5]-arr[8])==1||
abs(arr[5]-arr[9])==1||
abs(arr[6]-arr[9])==1||
abs(arr[7]-arr[8])==1||
abs(arr[8]-arr[9])==1
){
return false;
}
return true;
}
int main(){
vector<int>arr;
int ans=0;
for(int i=0;i<10;i++){
arr.push_back(i);
}
do{
if(check(arr)){
ans++;
}
}while(next_permutation(arr.begin(),arr.end()));
cout<<ans<<endl;
return 0;
}
寒假作业
#include<bits/stdc++.h>
using namespace std;
int a[13]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int b[12]; //保存一个全排列
int vis[13];
int ans=0;
void dfs(int level,int num){
if(level==3){
if(b[0]+b[1]!=b[2]){
return;
}
}
if(level==6){
if(b[3]-b[4]!=b[5]){
return;
}
}
if(level==9){
if(b[6]*b[7]!=b[8]){
return;
}
}
if(level==12){
if(b[9]==b[10]*b[11]){
ans++;
}
return;
}
for(int i=0;i<num;i++){
if(!vis[i]){
vis[i]=1;
b[level]=a[i];
dfs(level+1,num);
vis[i]=0;
}
}
}
int main(){
memset(vis,0,sizeof(vis));
dfs(0,13);
cout<<ans<<endl;
return 0;
}
注意这一点b[9]==b[10]*b[11]
,不要用b[9]/b[10]==b[11]
手链样式
#include<bits/stdc++.h>
using namespace std;
int main(){
int ans=0;
vector<string>arr; //保存所有str+str
string str="aaabbbbccccc";
do{
int i=0;
for(;i<arr.size();i++){
if(arr[i].find(str)!=string::npos){
break;
}
}
if(i!=arr.size()){
continue;
}
string temp=str+str;
arr.push_back(temp);
reverse(temp.begin(),temp.end());
arr.push_back(temp);
ans++;
}while(next_permutation(str.begin(),str.end()));
cout<<ans<<endl;
}
三羊献瑞
#include<bits/stdc++.h>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
int b[8]; //用于保存一个全排列
int vis[10];
int ans=0;
bool check(int b[]){
int sum=b[0]*10000+b[1]*1000+b[2]*100+b[3]*10+b[4];
int num1=b[5]*1000+b[3]*100+b[2]*10+b[6];
int num2=b[0]*1000+b[1]*100+b[7]*10+b[3];
if(num1+num2==sum){
return true;
}
return false;
}
void dfs(int level,int num){
if(level==8){ //八个数依次为"三羊生瑞气祥辉献"
if(check(b)){
ans++;
for(int i=0;i<8;i++){
cout<<b[i]<<" ";
}
cout<<endl;
}
return;
}
for(int i=0;i<num;i++){
if(!vis[i]){
vis[i]=1;
b[level]=a[i];
dfs(level+1,num);
vis[i]=0;
}
}
}
int main(){
memset(vis,0,sizeof(vis));
dfs(0,10); //level为0,数组中前十个数字
return 0;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)