您的位置:首页 > 编程语言 > C语言/C++

15年第六届蓝桥杯 c/c++ b组 题解(更新中)

2018-03-28 16:34 211 查看
1. 奖券数目 答案:52488
公式:8*9*9*9*9#include <cstdio>

int main() {
int sum = 0;
for(int i=10000; i<=99999; i++) {
if(i/10000%10 == 4 || i/1000%10 == 4 ||i/100%10 == 4 ||i/10%10 == 4 || i%10 == 4) continue;
else sum++;
}
printf("%d",sum);

return 0;
}2. 星系炸弹 答案:2017-08-05
exl拉:在一个格子里打上那个日期时间然后住下拉底下的格子能自动生成,拉到1001格#include <cstdio>

int number[3], days;

bool oneYearDays(int yTemp) {
if(yTemp%4 == 0 && yTemp%100 != 0 || yTemp%400 == 0) {
return true;
} else {
return false;
}
}

int oneMonthDays(int yTemp, int mTemp) {
if(mTemp == 1 || mTemp == 3 || mTemp == 5 || mTemp == 7 || mTemp == 8 || mTemp == 10 || mTemp == 12) {
return 31;
} else if(mTemp == 2) {
if(oneYearDays(yTemp)) return 29;
else return 28;
} else {
return 30;
}
}

int main() {
scanf("%d-%d-%d%d",&number[0],&number[1],&number[2],&days); //2014-12-31 //2014-11-30 //2014-11-15
for(int i=0; i<days; i++) {
if(number[2]+1 > oneMonthDays(number[0],number[1])) {
if(number[1]+1 > 12) {
number[0]++;
number[1] = 1;
number[2] = 1;
} else {
number[1]++;
number[2] = 1;
}
} else {
number[2]++; //////增量法求日期跨度问题
}
}
printf("%d-%02d-%02d",number[0],number[1],number[2]);

return 0;
}3. 三羊献瑞 答案:1085#include <cstdio>

int number[8];
bool vis[8];

void DFS(int index) {
if(index == 8) {
if((number[0]*1000+number[1]*100+number[2]*10+number[3]) +
(number[4]*1000+number[5]*100+number[6]*10+number[1]) ==
(number[4]*10000+number[5]*1000+number[2]*100+number[1]*10+number[7])) {
printf("%d %d %d %d\n",number[4],number[5],number[6],number[1]);
}
return;
}
for(int i=0; i<10; i++) {
if(i == 0 && (index == 0 || index == 4)) {
continue;
}
if(!vis[i]) {
vis[i] = true;
number[index] = i;
DFS(index+1);
vis[i] = false;
}
}
}

int main() {
DFS(0);

return 0;
}代码2: #include <cstdio>
#include <algorithm>
using namespace std;

int main() {
int a[10];
for (int i = 0; i < 10; i++) a[i] = i;

do {
if (!a[2] || !a[6]) continue;
int x = a[2]*1000 + a[3]*100 + a[4]*10 + a[5];
int y = a[6]*1000 + a[7]*100 + a[8]*10 + a[3];
int z = a[6]*10000 + a[7]*1000 + a[4]*100 + a[3]*10 + a[9];
if (x + y == z) printf("%d + %d = %d\n", x, y, z);
} while (next_permutation(a, a+10));

return 0;
}

4. 格子中输出
5. 九数组分数#include <stdio.h>

void test(int x[])
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];

if(a*3==b) printf("%d / %d\n", a, b);
}

void f(int x[], int k)
{
int i,t;
if(k>=9){
test(x);
return;
}

for(i=k; i<9; i++){

t=x[k];
x[k]=x[i];
x[i]=t;

f(x,k+1);

t=x[k];
x[k]=x[i];
x[i]=t;
}
}

int main()
{
int x[] = {1,2,3,4,5,6,7,8,9};
f(x,0);
return 0;
}6. 加法变乘法 答案:16#include <stdio.h>

int number[2];
bool vis[50];

void DFS(int index) {
if(index == 2) {
int sum = 0;
for(int j=1; j<=49; j++) {
if(j == number[0] || j == number[1]) {
sum += j*(j+1);
j++;
} else {
sum += j;
}
}
if(sum == 2015) printf("%d %d\n",number[0],number[1]);
return;
}
for(int i=1; i<49; i++) {
if(!vis[i] && i>number[0]) {
vis[i] = vis[i-1] = vis[i+1] = true;
number[index] = i;
DFS(index+1);
vis[i] = vis[i-1] = vis[i+1] = false;
}
}
}

int main() {
DFS(0);

return 0;
}代码2:#include <stdio.h>

int main() {
for (int i = 1; i <= 48; i++) {
for (int j = i + 2; j <= 48; j++) {
if (1225 - i - (i+1) - j - (j+1) ==
2015 - i*(i+1) - j*(j+1))
printf("%d\n", i);
}
}
return 0;
}
7. 牌型种数 答案:3598180#include <cstdio>

int main() {
int a[13], cnt = 0; //13种牌所以13层循环(13个桶),每次循环代表选择这种牌的数目,范围是[0,4]
for(a[0]=0; a[0]<=4; a[0]++)
    for(a[1]=0; a[1]<=4; a[1]++)
for(a[2]=0; a[2]<=4; a[2]++)
for(a[3]=0; a[3]<=4; a[3]++)
for(a[4]=0; a[4]<=4; a[4]++)
for(a[5]=0; a[5]<=4; a[5]++)
for(a[6]=0; a[6]<=4; a[6]++)
for(a[7]=0; a[7]<=4; a[7]++)
for(a[8]=0; a[8]<=4; a[8]++)
for(a[9]=0; a[9]<=4; a[9]++)
for(a[10]=0; a[10]<=4; a[10]++)
for(a[11]=0; a[11]<=4; a[11]++)
for(a[12]=0; a[12]<=4; a[12]++)
if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13) cnt++; //如果总数达到13张
printf("%d",cnt);

return 0;
}
8. 移动距离#include <cstdio>
#include <cmath>
using namespace std;

int main() {
int w, m, n;
scanf("%d%d%d",&w,&m,&n);
m--; ////
n--; ////
int m_x = m / w, m_y = m % w;
if(m_x & 1) { //m1的最后一位是1的话,返回1,否则返回0
m_y = w - 1 - m_y;
}
int n_x = n / w, n_y = n % w;
if(n_x & 1) {
n_y = w - 1 - n_y;
}
printf("%d",abs(m_x - n_x) + abs(m_y - n_y));

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: