【Openjudge】排队游戏(递归)

这个其实用循环或者栈写很简单而且很容易懂。而且其实就是括号匹配。

这里用递归写,递归写相对来说麻烦一点,思路如下:

用函数bg表示递归函数,该函数的作用是找到其参数n位置上的左括号所对应的右括号,然后弹出完成该层函数的递归。

每一层都需要完成这样的任务,接下来就详细说说怎么完成这个任务。

假设我们进入了c[n]所对应的左括号的递归,现在,设m处是c[n]所对应的右括号所在的位置。

那么在(n,m)这个区间中,可能有无数组下一级的匹配的括号。(所谓下一级就是指的是:比如((()())()),这一组中,一共有十个括号,第一个和第十个括号我们看做n和m,那么第二个括号,第七个括号构成了下一级的匹配的括号,第八个第九个括号构成了下一级的匹配的括号;如果把第二个和第七个看成n和m,那么第三个和第四个构成了下一级的匹配的括号,第五个和第六个构成了下一级的匹配的括号。)

 

还那这个例子说话,((()())()),这个例子中,把第一个和第十个看成n和m,那么下一级匹配的括号有两组,当然,我们很容易可以看出,我们还可以增加或者减少下一级匹配的括号的组数,所以说,在(n,m)这个区间中,可能有无数组下一级的匹配的括号。

 

因此,有我们所定义的递归函数,这里有多次平行的函数多次运行。可以理解为,一层递归函数的下一层中,有多个平行的一样的递归函数。

 

这个代码里,我们用循环来完成这样的平行的递归。

 

直到找到我们的n所对应的m,这层递归才会完成。

#include
#include
using namespace std;

int bg(int);

char boy,girl;
char c[110] = {};

int main()
{
	 cin>>c;
	 boy = c[0];
	 int n = strlen(c);
	 for (int i = 0 ; i < n ; i ++)//遍历子付出,找到boy,girl对应的字符。
		 if (c[i] != boy)
		 {
			 girl = c[i];
			 break;
		 }
	 bg(0);
	 
	 return 0;
}

int bg(int n)
{
	if (c[n] == girl)
		return n;
	if (c[n] == 0)
		return n;
	int r = n+1;
	while (c[r] != 0 && c[r] != girl)//完成平行的递归的循环,以及注意之前r=n+1,如果改成r=n就完全错了,原因在于我们每次递归完成的时候返回的是所匹配的右括号的下一个位置。
	{
		r = bg (r);
	}
	if (c[r] == girl)
	{
		cout<

 

 

 

呀,18.9.1无聊又做了一边这个题,代码风格还是思路都清晰了不少,把今天做的也贴上来。

#include
#include

using namespace std;

int boysAndGirls(const string &s, const int &l, int p, const char &boy, const char &girl){
    int q = p - 1;
    while(p < l && s[p] == boy){
        q = boysAndGirls(s, l, p + 1, boy, girl) + 1;
        cout << p << ' ' << q << endl;
        p = q + 1;
    }
    return q;
}

int main()
{
    string s;
    cin >> s;
    char boy, girl;
    boy = s[0];
    int l = s.length();
    for (auto ele:s)
        if(ele != boy) {
            girl = ele;
            break;
        }
    boysAndGirls(s, l, 0, boy, girl);
    return 0;
}

 

你可能感兴趣的:(Openjudge)