蓝桥杯练习 实用性原则 【dfs】

  1. 猜年龄
    【问题描述】
    美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。
    他曾在1935~1936年应邀来中国清华大学讲学。
    一次,他参加某个重要会议,年轻的脸孔引人注目。
    于是有人询问他的年龄,他回答说:
    “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
    请你推算一下,他当时到底有多年轻。
//实用性原则,满足条件的情况不多,可以将他们都列举出来,看出答案为5832 104976满足  则为18岁 
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[10];
char b[10];
int main()
{
    for(int i = 10;i<100;i++)
    {
        int num1 = i*i*i;
        int num2 = num1*i;
        _itoa(num1,a,10);
        _itoa(num2,b,10);//最后一个参数是转换的进制数 
    //  cout<<strlen(a)<<endl;
    //  cout<<strlen(b)<<endl;
        if(strlen(a) == 4 && strlen(b)== 6)cout<<i<<' '<<num1<<' '<<num2<<endl;

    }
    return 0;
}

九宫幻方
【问题描述】

小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。
三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:
“二四为肩,六八为足,左三右七,戴九履一,五居其中”,
通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。
现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。

而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~

输入格式:
输入仅包含单组测试数据。
每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。

输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。

样例输入
0 7 2
0 5 0
0 3 0

样例输出
6 7 2
1 5 9
8 3 4

/*
4 9 2
3 5 7
8 1 6
*/ 

#include<iostream>
using namespace std;
int b[9]= {0,7,2,0,5,0,0,3,0};
int flag = 1;
int main()
{
    int a[8][9] = {4,9,2,3,5,7,8,1,6,
                  8,3,4,1,5,9,6,7,2,
                  6,1,8,7,5,3,2,9,4,
                  2,7,6,9,5,1,4,3,8,
                  2,9,4,7,5,3,6,1,8,
                  4,3,8,9,5,1,2,7,6,
                  8,1,6,3,5,7,4,9,2,
                  6,7,2,1,5,9,8,3,4
                  };

    for(int i = 0;i<8;i++)
    {   flag  = 1;//开始忘记加这句话 导致什么也不输出  
        for(int j = 0;j<9;j++)
        {
            if(b[j]!=0 && a[i][j] != b[j])
            {
                flag = 0;
                break;
            }   
        }
        if(flag == 1)
        {
            for(int m = 0;m<9;m++)
            {
            //  cout<<a[i][m]<<endl;
                if((m+1)%3==0) cout<<a[i][m]<<endl;
                else cout<<a[i][m]<<' ';
            }
            break;
        }

    } 
    return 0; 

}

出栈次序
【问题描述】
X星球特别讲究秩序,所有道路都是单行线。
一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。
出栈次序.jpg
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
/*
如果进栈次序为:1 2 3 4 5 。。。
出栈次序有多少种情况?

*/

    // n 个等着进栈,栈中有m个
    int f3(int n, int m)
    {
        if (n == 0) 
            return 1;
        if (m == 0) 
            return f3(n - 1, 1);
        return 
            f3(n, m - 1) + f3(n - 1, m + 1);
    }

    int f5(int n)
    {
        return f3(n, 0);
    }

    void main()
    {
        for (int i = 1; i<17; i++)
        {
            printf("%d : %d \n", i, f5(i));
        }
    }

参数的设定并不唯一,但是都要考虑当栈为空的时候,只能入栈不能出栈的情况

#include<iostream>
using namespace std;
long long int f(int x,int y);
int main()
{
    cout<<f(16,0)<<endl;;

    return 0;
}
//long long int  f(int x,int y)
//{
//  if(y == 0) return f(x-1,1);
//  if(x == 0)return 1;
//  return f(x,y-1)+ f(x-1,y+1);
//}
long long int f(int x,int y)
{
    if(x == 0)return 1;
    if((x+y)==16) return f(x-1,y);//一定要考虑到这个 当栈为空时,只能入栈 
    return f(x-1,y)+f(x,y+1);

}

第39级台阶
【问题描述】

小明刚刚看完电影《第39级台阶》。离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。

老师给的参考,两个函数相互调用。但其实不用这样。

public class A
{
    // 奇数步
    static long g(int n)
    {
        if(n==0) return 0;
        if(n==1) return 1;
        //if(n==2) return 1;

        return f(n-1) + f(n-2);
    }

    // 偶数步
    static long f(int n)
    {
        if(n==0) return 1;
        if(n==1) return 0;
        //if(n==2) return 1;

        return g(n-1) + g(n-2);
    }

    public static void main(String[] args)
    {
        System.out.println(f(5));
        System.out.println(f(39));
    }
}

我的写法
就一条路走到黑,最后判定是不是满足是一个偶数步数即可。

#include<iostream>
using namespace std;
int cnt;
int ans;
void dfs(int x,int cnt);//还剩多少台阶
int main()
{
    dfs(39,0);
    cout<<ans<<endl;
    return 0;
} 
void dfs(int x,int cnt)
{
    if(x<0)return ;//这句话一定要注意,不能出现x小于0的时候,说明迈过去了 就应该正好等于0 
    if(x== 0 && cnt%2==0)
    {
        ans++;
        return ;
    }
    dfs(x-1,cnt-1);
    dfs(x-2,cnt+1);
    return ;
}

猜你喜欢

转载自blog.csdn.net/weixin_38293125/article/details/79763446