思路:找不含有’4’的数字,可以取商取余找出不是4的
我这里用的是转成字符串,然后用s.find()函数进行一个判断
#include
#include
#include
using namespace std;
void i2s(int num,string &str){
stringstream ss(str);
ss<<num;
ss>>str;
}
int main(){
int ans=0;
string s=" ";
for(int i=10000;i<=99999;++i){
i2s(i,s);
if(s.find('4')==string::npos)
ans++;
}
cout<<ans;
return 0;
}
答案:52488
思路:用Excel表格的日期函数
答案:2017-08-05
思路:
1.暴力循环解决
2.全排列判断解决
3.DFS剪枝解决
暴力解法
#include
using namespace std;
int main() {
for(int a=2; a<=9; ++a)
for(int b=0; b<=9; ++b) {
if(b==a)continue;
for(int c=0; c<=9; ++c) {
if(c==b||c==a)continue;
for(int d=0; d<=9; ++d) {
if(d==c||d==b||d==a)continue;
int e=1;
for(int f=0; f<=9; ++f) {
if(f==e||f==d||f==c||f==b||f==a)continue;
for(int g=0; g<=9; ++g) {
if(g==f||g==e||g==d||g==c||g==b||g==a)continue;
for(int h=0; h<=9; ++h) {
if(h==g||h==f||h==e||h==d||h==c||h==b||h==a)continue;
int x=a*1000+b*100+c*10+d;
int y=1000+f*100+g*10+b;
int z=10000+f*1000+c*100+b*10+h;
if((x+y)==z)
cout<<e<<" "<<f<<" "<<g<<" "<<b<<endl;
}
}
}
}
}
}
return 0;
}
全排列解法
#include
#include
using namespace std;
int a[10]= {0,1,2,3,4,5,6,7,8,9};
bool check() {
int s1=0,s2=0,sum=0;
s1=a[0]*1000+a[1]*100+a[2]*10+a[3];//祥瑞生辉
s2=a[4]*1000+a[5]*100+a[6]*10+a[1];//三羊献瑞
sum=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];//三羊生瑞气
if(a[0]!=0&&a[4]==1&&s1+s2==sum)
printf("%d %d %d %d\n",a[4],a[5],a[6],a[1]);//三羊献瑞
}
int main() {
do{
check();
}while(next_permutation(a,a+10));
return 0;
}
DFS解法
#include
#include
using namespace std;
int a[8];
bool vis[10]={0};
bool check() {
int s1=0,s2=0,sum=0;
s1=a[0]*1000+a[1]*100+a[2]*10+a[3];//祥瑞生辉
s2=a[4]*1000+a[5]*100+a[6]*10+a[1];//三羊献瑞
sum=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];//三羊生瑞气
if(a[0]!=0&&a[4]==1&&s1+s2==sum)
printf("%d %d %d %d\n",a[4],a[5],a[6],a[1]);//三羊献瑞
}
void dfs(int n){
if(n==8){
check();
return ;
}
for(int i=0;i<10;++i){
if(!vis[i]){
a[n]=i;
vis[i]=1;
dfs(n+1);
vis[i]=0;
}
}
}
int main() {
dfs(0);
return 0;
}
答案:1085
思路:%*s是需要两个参数,第一个是int型,第二个是%s,表示用s填补
所以这里要有五个参数的
中间的肯定是字符串s
填补的话,肯定是空格填补
然后长度就是各占一半,如果没有那个-1,得出来的图形是错位的,自己再进行微调
void StringInGrid(int width, int height, const char* s)
{
printf("%*s%s%*s",(width-strlen(s)-2)/2," ",s,(width-strlen(s)-2)/2," "); //填空
}
答案:printf("%*s%s%*s",(width-strlen(s)-2)/2," “,s,(width-strlen(s)-2)/2,” ");
思路:很明显的递归回溯,需要多练,就可以一眼看出
不要乱格式化原题代码,这里的填空处虽然只有一行,但它上两行写了三条语句,是个swap
所以下面可能也不止一条语句。
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; // 填空处
}
}
答案:t=x[k]; x[k]=x[i]; x[i]=t;
思路:
1+2+3+ … + 49 = 1225
1+2+3+…+1011+12+…+2728+29+…+49 = 2015
下式减上式得出一个式子:(i*(i+1)+j*(j+1)) - (i+(i+1)+j+(j+1)) =2015-1225
#include
using namespace std;
int main() {
for(int i=1; i<=49; ++i) {
for(int j=i+2; j<=49; ++j) {
if(1225-i-(i+1)-j-(j+1)+i*(i+1)+j*(j+1)==2015)
cout<<i<<endl;
}
}
return 0;
}
答案:16
思路:4个人,一人13张。可以做13层循环
也可以dfs判断,可以发现dfs在蓝桥杯里是很受欢迎的
#include
using namespace std;
int ans = 0, sum = 0;
void dfs(int cur,int sum) { //cur代表牌的种类,sum代表一个人得到牌的总数
if(sum>13) { //还没把所有牌的种类遍历完就已经超过13张
return ;
}
if(cur==13) {
if(sum==13)
ans++;
return ;
}
for(int i=0; i<=4; i++) //i代表每种牌取得张数
dfs(cur+1,sum+i);
}
int main() {
dfs(0,0);
cout << ans << endl;
return 0;
}
答案:3598180
思路:两个点的距离,不能走斜的,这个距离有专业名词:曼哈顿距离公式
距离=|x1-x2|+|y1-y2|
我们要知道这两个点的坐标,我们得知道这个数组是什么样的
给出了宽w,找出坐标和w的关系
我们称数字由左向右变大是正向,由右向左是逆向
#include
#include
using namespace std;
int main() {
int w,x,y;
int sum=0;
cin>>w>>x>>y;
int xm=0,xn=0,ym=0,yn=0;
xm=x%w==0?x/w:(x/w)+1;
ym=y%w==0?y/w:(y/w)+1;
if(xm%2==0) //说明x在逆行中
xn=xm*w-x+1;
else xn=w-(xm*w-x);
if(ym%2==0) //说明y在逆行中
yn=ym*w-y;
else yn=w-(ym*w-y);
sum=abs(ym-xm)+abs(yn-xn); //曼哈顿距离公式
cout<<sum<<endl;
return 0;
}