蓝桥杯第六届省赛C/C++B组个人题解

版权声明:转载请注明出处https://blog.csdn.net/hhmy77 https://blog.csdn.net/hhmy77/article/details/88782056

奖券数目

直接暴力 答案 52488

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int ans=0;
	for(int i=10000;i<=99999;i++)
	{
		int t=i;
		bool ok=true;
		while(t)
		{
			if(t%10==4)
			{
				ok=false;
				break;
			}
			t/=10;
		}
		if(ok)ans++;
	} 
	cout<<ans;
}

星系炸弹

excel填一下 2017-8-5

三羊献瑞

这题有意思了 可以用数学直接推出来
首先三必定是1,祥+1=10+羊(+1) 进位情况+1

  1. 有进位的情况 祥=10+羊 不成立 此处没有进位
  2. 因为没有进位 祥只能等于9,羊就等于0了

现在我们有瑞+羊=生,因为没有进位 瑞=生 不成立,所以我们有
1.生+献(+1)=10+瑞
2.瑞+1=生
对于1. 如果没有进位 综合1.2可以得出献等于9,不成立,所以必有进位
1.生+献+1=10+瑞
2.瑞+1=生
综合1.2.,可以推出献等于8
现在我们有

0  1       8  9
羊 三      献 祥

但是这不足以求出生和瑞。
我们继续往后看,由上一步有进位得出 辉+瑞=10+气
那么我们枚举一下生和瑞的可能

生 3 4 5 6 7
瑞 2 3 4 5 6

显然辉不等于8和9且气不等于0和1(三和羊)那么瑞=2,=3,=4的情况排除掉

生 6 7
瑞 5 6

瑞等于6 则生等于7 那么辉只能等于5或者4,此时又不成立
那么最后答案就出来了

 9567
+1085
10652

第二种方法 直接搜

#include<bits/stdc++.h>
using namespace std;
int flag[11]={0};
//1 2 3 4 5 6 7 8
//三羊献瑞祥生辉气 
int num[8]={0};
bool check(int n)
{
	if(n/10000==num[1]&&n/1000%10==num[2]&&n/100%10==num[6]&&n/10%10==num[4]&&n%10==num[8])
	{
		return true;
	}
	return false;
}
void dfs(int cur)
{
	if(cur>9)
	{
		int A=num[1]*1000+num[2]*100+num[3]*10+num[4];
		int B=num[5]*1000+num[4]*100+num[6]*10+num[7];
		int C=A+B;
		if(check(C))
		{
			cout<<A<<"+"<<B<<"="<<C<<endl;
		}
		return;
	}

//	if(num[cur]==0)
	for(int i=0;i<10;i++)
	{
		if(flag[i]==0)
		{
			num[cur]=i;
			flag[i]=1;
			dfs(cur+1);
			flag[i]=0;
		}
	}
	return; 

}
int main()
{
	dfs(1);
}

格子中输出

https://blog.csdn.net/rl529014/article/details/50737009

组分数

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

加法变乘法

这道题有公式
1+2+3+…+48+49=1225
1+2+3+…(x-1)x+(y-1)y+…49=1225;
上式相减做差,得到
x
x+y
y-x-y-2=790;
我们直接枚举就得到xy了
当然你也可以先选一个x,算(x-1)*x,然后根据这个x做(y-1)y=2015-1225+x+x-1+y+y-1( x已经确定了)来确定y 最后判断一下就行了
在这里插入图片描述
代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int x=1;x<=50;x++)
	{
		for(int y=x+2;y<=50;y++)
		{
			if(x*x+y*y-x-y-2==790) cout<<x<<" "<<y<<endl;
		}
	}
} 

牌型总数

每种牌0~4张,枚举一下所有可能的结果即可

#include <stdio.h>  

int ans = 0, sum = 0;  
 
void dfs(int cur,int sum)
{
	if(sum>13)return;
	if(cur==13)
	{
		if(sum==13) ans++;
		return;
	}
	for(int i=0;i<5;i++) dfs(cur+1,sum+i);
}
int main()  
{  
    dfs(0,0);  
    printf("%d",ans);
    return 0;  
}  

移动距离

这道题不难 只是要仔细想
两个数之间的距离为 它们所在行相减+它们所在列相减
所在行我们直接用相除就行了
所在列呢?
观察样例 偶数列从左往右填数,奇数列从右往左填数,那么我们根据这个规律找一下x,y所在的列即可
代码

#include<bits/stdc++.h>
using namespace std;
int w,m,n;
void fun(int row,int num,int &cnt)
{
	//偶 从左到有 
	if(row%2==0)
	{
		int temp=row*w+1;
		while(temp!=num)
		{
			temp++;
			cnt++;
		} 
	}
	else
	{
		int temp=(row+1)*w;
		while(temp!=num)
		{
			temp--;
			cnt++;
		}
	}
}
int main()
{
	//宽度,楼号 
	cin>>w>>m>>n;
	int ans=0;
	//m,n的行 
	int mr=m/(w+1);
	int nr=n/(w+1);
	ans+=abs(mr-nr);
	//计算m,n的列 
	int mw=0,nw=0;
	fun(mr,m,mw);
	fun(nr,n,nw);
	ans+=abs(mw-nw);
	cout<<ans;
} 

累骰子 生命之树

不会QAQ

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/88782056