蓝桥杯 排列数字-今有7对数字

本文探讨了一种特殊的数字排列问题,即在一系列重复数字中,如何根据特定规则进行排列,使得每对数字之间恰好间隔指定数量的其他数字。通过递归与回溯算法实现了求解过程,并给出了一种以74开头的排列方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

回溯虐我很多遍啊。。。

我的递归和回溯真的不行啊,唉,还好调试许久终于搞定了;

ans:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #include<string>
 7 #include<cmath>
 8 using namespace std;
 9 int a[20];
10 int cou[20],b[20];
11 void dfs(int i,int t,int p)//  t 表示的是多少位;
12 {
13 
14       if(p==10)
15       {
16           //cout<<"whywhy"<<endl;
17           for(int mm =1; mm<=14; mm++)
18                printf("%d",a[mm]);
19                     printf("\n");
20                     return ;
21       }
22     if(cou[i]==2 || a[t]!=0 || a[t+i+1]!=0|| i+t>13)
23     {
24         //cout<<"i= "<<i<<"t= "<<t<<endl;
25         //cout<<cou[i]<<" "<<a[t]<<" "<<a[t+i+1]<<endl;
26         //cout<<"what what"<<endl;
27         return ;
28     }
29       else
30       {
31         a[t]=i;
32         a[t+i+1]=i;
33         cou[i]=2;
34         for(int k=1;k<=7;k++)
35         {
36           for(int j =t+1;j<=14;j++)
37           {
38              dfs(k,j,p+2);
39           }
40         }
41         a[t]=0;
42         a[t+i+1]=0;
43         cou[i]=0;
44 
45      }
46 }
47 int main()
48 {
49     memset(a,0,sizeof(a));
50     memset(cou,0,sizeof(cou));//统计出现的次数
51     a[1] = 7;
52     a[2] = 4;
53     a[7] = 4;
54     a[9] = 7;
55     cou[7] = 2;
56     cou[4] = 2;
57     dfs(1,3,0);
58     return 0;
59 }

 

转载于:https://www.cnblogs.com/lovychen/p/4411288.html

### 蓝桥杯数字排列算法题解法 蓝桥杯竞赛中的数字排列类题目通常涉及数组操作、排序以及动态规划等核心概念。以下是关于此类问题的一种常见解决方法。 #### 排序基础 对于初学者来说,掌握基本的排序算法是非常重要的。例如冒泡排序是一种简单直观的方法[^2]: ```c #include <stdio.h> void bubbleSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-1-i; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[] = {5, 2, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, n); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); // 输出 1 2 5 5 9 } return 0; } ``` 尽管如此,在实际比赛中更高效的排序方式如快速排序会被推荐使用。 #### 动态规划的应用 当涉及到复杂的排列组合或者最优路径寻找时,动态规划成为一种强有力的工具。它通过把原问题分解成相对简单的子问题来求解复杂问题[^1]。比如计算斐波那契数列第n项可以采用如下递推关系F(n)=F(n−1)+F(n−2),其中初始条件为F(0)=0,F(1)=1。 #### 组合数学与回溯法 某些特定类型的数字排列可能还需要运用到组合数学的知识点或者是利用回溯法去穷尽所有的可能性再筛选符合条件的结果集。这类技术特别适用于那些需要枚举所有情况才能得出最终解答的情形下非常有效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值