开始寒假做题的第一天
蓝桥杯刷题赛车牌问题
开始的想法是用数学自己算出来直接写答案,但是后来发现有很多累加漏加的地方,只能用程序来实现。
第一种方法是暴力循环:
六位数字一共有16x16x16x10x10x10=4096000种情况,所以要进行4096000次循环就可以完成车牌的筛选。代码如下:
#include<iostream>
using namespace std;
int main()
{
long long count=0;
for(int a=0;a<=15;a++){
for(int b=0;b<=15;b++){
for(int c=0;c<=15;c++){
if(a==b&b==c) continue;
for(int d=0;d<=9;d++){
if(c==d&&b==c) continue;//避免连续三个相等多加的情况
for(int e=0;e<=9;e++){
if(c==d&&d==e) continue;
for(int f=0;f<=9;f++){
if(d==e&e==f) continue;
count++;
}
}
}
}
}
}
cout<<count<<endl;
return 0;
}
第二种方法是用dfs树枝搜索:
开始并不了解,通过相关知识后知道的方式搜索主要用递归和回溯来实现深度搜索。
代码如下:
#include <iostream>
using namespace std;
int ans;
void dfs(int u, int a, int b)
{
if(u == 7)
{
ans ++;
return;
}
int n = u <= 3? 15 : 9;
for (int i = 0; i <= n; i ++)
{
if(a == b && b == i) continue;
dfs(u + 1, b, i);
}
}
int main()
{
dfs(1, -1, -1);
cout << ans << endl;
return 0;
}
开始考虑了a和b为什么要从-1开始,在逐次自己跟着循环走才解决了问题,很巧妙的初始化。在最开始还是没想懂continue和递归这么多次后为什么每次都会让ans++。continue语句可以剔除除了if里面的情况。
蓝桥杯刷题赛乘法表
开始想用函数解决问题,利用进制转换的知识来解决。在写完发现错误,检查后知道了我只把结果变成想要的进制形式,而前面两个乘数没有变成想要的进制形式。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int P;
char a[36];//将指定进制转换后的数存入数组
string change(int n);
int main()
{
cin>>P;
for(int i=0;i<=9;i++) a[i]=(char)('0'+i);
for(int i=10;i<=35;i++) a[i]=(char)('A'+i-’10‘);
for(int i=1;i<P;i++){
for(int j=1;j<=i;j++){
cout<<a[i]<<"*"<<a[j]<<"="<<change(i*j)<<' ';//相隔的空格不要落下
}
cout<<endl; //这个换行应该第二个循环外面
}
return 0;
}
string change(int n)
{
string s;
while(n){
s+=a[n%P];
n/=P;
}
reverse(s.begin(),s.end());//利用c++库reverse函数逆转字符串
return s;
}
出现的问题:1、进制转换要换全;
2、严格按照输出的形式进行修改。
蓝桥杯刷题赛Fibonacci集合
可以把元素依次存入容器中,比较最小值输入,提前了解了c++vector容器的知识http://t.csdn.cn/iWxAX
代码如下:
#include<bits/stdc++.h>
using namespace std;
vector<int> a = {1, 2, 3, 5, 8};
int main()
{
int i = 2;
int j = 1;
int k = 0;
int res = 0;
for (int m = 5; m < 2020; m++)
{
int r = 3 * a[i] + 2;
int s = 5 * a[j] + 3;
int t = 8 * a[k] + 5;
res = min({r, s, t});
a.push_back(res);
if (r == res)
{
i++;
}
if (s == res)
{
j++;
}
if (t == res)
{
k++;
}
}
cout << res << endl;
return 0;
}
开始没懂为什么要设i,j,k三个变量,要取最小的来往下继续推进,不重不漏。

被折叠的 条评论
为什么被折叠?



