递归的几个简单题目

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


posted @ 2013-04-09 11:51  N3verL4nd  阅读(180)  评论(0编辑  收藏  举报