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

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值