zoukankan      html  css  js  c++  java
  • 递归的几个简单题目

    1、

    描述

    如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1)。对于两个结点x和y,假设他们到根结点的路径分别是(x1, x2, ... ,1)和(y1, y2, ... ,1)(这里显然有x = x1,y = y1),那么必然存在两个正整数i和j,使得从xi 和 yj开始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,... 现在的问题就是,给定x和y,要求xi(也就是yj)。
    输入
    输入只有一行,包括两个正整数x和y,这两个正整数都不大于1000。
    输出
    输出只有一个正整数xi
    样例输入
    10 4
    样例输出
    2
    #include <iostream>
    using namespace std;
    
    int common(int x, int y)
    {
    	if(x == y) 
    	{
    		return x;
    	}
    	else if(x > y)
    	{
    		return common(x / 2 , y);
    	}
    	else
    	{
    		return common(x , y / 2);
    	}
    }
    
    int main()
    {
    	int x, y;
    	cin >> x >> y;
    	cout << common(x, y) << endl;
    }


    2、

    描述
    逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
    输入
    输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
    输出
    输出为一行,表达式的值。
    可直接用printf("%f\n", v)输出表达式的值v。
    样例输入
    * + 11.0 12.0 + 24.0 35.0
    样例输出
    1357.000000
    提示
    可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。
    此题可使用函数递归调用的方法求解。

    #include <cstdio>
    #include <iostream>
    #include<cmath>
    #include <string>
    #include <cstdlib>
    using namespace std;
    double fun(void)
    {
    	string str;
    	cin >> str;
    	switch(str[0])
    	{
    	case '+' : return fun( ) + fun( );break;
    	case '-' : return fun( ) - fun( );break;
    	case '*' : return fun( ) * fun( );break;
    	case '/' : return fun( ) / fun( );break;
    	default  : return atof(str.c_str());
    	}
    }
    int main(void)
    {
    	freopen("in.txt", "r", stdin);
    	double ans;
    	ans = fun();
    	printf("%f\n", ans);
    	return 0;
    }
    


    3、

    放苹果
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 22804   Accepted: 14503

    Description

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

    Input

    第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

    Output

    对输入的每组数据M和N,用一行输出相应的K。

    Sample Input

    1
    7 3
    

    Sample Output

    8
    #include <iostream>
    using namespace std;
    
    int count(int x, int y)
    {
    	if(y == 1 || x == 0)
    	{
    		return 1;
    	}
    	if(x < y) 
    	{
    		return count(x, x);
    	}
    	return count(x, y - 1) + count(x - y, y);
    }
    
    int main()
    {
    	int t,m ,n;
    	cin >> t;
    	while(t--)
    	{
    		cin >> m >> n;
    		cout << count(m, n) << endl;
    	}
    	return 0;
    }



    4、


    描述
    有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
    输入
    包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
    1)‘.’:黑色的瓷砖;
    2)‘#’:白色的瓷砖;
    3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
    当在一行中读入的是两个零时,表示输入结束。
    输出
    对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
    样例输入
    6 9 
    ....#. 
    .....# 
    ...... 
    ...... 
    ...... 
    ...... 
    ...... 
    #@...# 
    .#..#. 
    0 0
    
    样例输出
    45
    #include <iostream>
    #include <cstring>
    using namespace std;
    #define MAX 25
    char maps[MAX][MAX];
    const int moves[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
    bool visited[MAX][MAX];
    int n, m;
    int count;
    
    void DFS(int x, int y)
    {
    	visited[x][y] = true;
    	for(int i = 0; i < 4; i++)
    	{
    		int p = x + moves[i][0];
    		int q = y + moves[i][1];
    		if(p >=1 && p <= m && q >=1 && q <= n && !visited[p][q] && maps[p][q] == '.')
    		{
    			count++;
    			visited[p][q] = true;
    			DFS(p , q);
    		}
    	}
    }
    
    int main()
    {
    	freopen("in.txt", "r", stdin);
    	int i, j, x, y;
    	while(cin >> n >> m)
    	{
    		if(n == 0 && m == 0) break;
    		for(i = 1; i <= m; i++)
    		{
    			for(j = 1; j <= n; j++)
    			{
    				cin >> maps[i][j];
    				if(maps[i][j] == '@')
    				{
    					x = i;
    					y = j;
    				}
    			}
    		}
    		count = 1;
    		memset(visited, false, sizeof(visited));
    		DFS(x, y);
    		cout << count << endl;	
    	}
    	return 0;
    }

    #include <stdio.h>
    int W, H;
    char z[21][21];
    int f(int x, int y)
    {
        if(x < 0 || x >= W || y < 0 || y >= H) // 如果走出矩阵范围
            return 0;
        if(z[x][y] == '#')
            return 0;
        else
        {
            z[x][y] = '#'; // 将走过的瓷砖做标记
            return 1 + f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x, y + 1);
        }
    }
    int main(void)
    {
        int i, j, num;
        while(scanf("%d %d", &H, &W) && W != 0 && H != 0)
        {
            num = 0;
            for(i = 0; i < W; i++) // 读入矩阵
                scanf("%s", z[i]);
            for(i = 0; i < W; i++)
                for(j = 0; j < H; j++)
                    if(z[i][j] == '@') printf("%d\n", f (i , j));
        }
        return 0;
    }
    


  • 相关阅读:
    【3】hexo+github搭建个人博客的主题配置
    【2】hexo+github搭建个人博客的简单使用
    每日思考(2020/05/06)
    每日思考(2020/05/05)
    每日思考(2020/03/27)
    文件和异常
    每日思考(2020/03/24)
    图形用户界面和游戏开发
    每日思考(2020/03/19)
    面向对象进阶
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835135.html
Copyright © 2011-2022 走看看