zoukankan      html  css  js  c++  java
  • 排队游戏

    总时间限制: 1000ms  内存限制: 65536kB
    描述

    在幼儿园中,老师安排小朋友做一个排队的游戏。首先老师精心的把数目相同的小男孩和小女孩编排在一个队列中,每个小孩按其在队列中的位置发给一个编号(编 号从0开始)。然后老师告诉小朋友们,站在前边的小男孩可以和他后边相邻的小女孩手拉手离开队列,剩余的小朋友重新站拢,再按前后相邻的小男孩小女孩手拉 手离开队列游戏,如此往复。由于教师精心的安排,恰好可以保证每两个小朋友都能手拉手离开队列,并且最后离开的两个小朋友是编号最小的和最大的两个小朋 友。(注:只有小男孩在前,小女孩在后,且他们两之间没有其他的小朋友,他们才能手拉手离开队列)。请根据老师的排队,按小女孩编号从小到大的顺序,给出 所有手拉手离开队列的小男孩和小女孩的编号对。

    输入
    用一个字符串代表小朋友队列。字符串中只会出现两个字符,分别代表小男孩和小女孩,首先出现的字符代表小男孩,另一个字符代表小女孩。小孩总数不超过100
    输出
    按小女孩编号顺序,顺序输出手拉手离开队列的小男孩和小女孩的编号对,每行一对编号,编号之间用一个空格分隔。
    样例输入
    ((()(())())(()))
    样例输出
    2 3
    5 6
    4 7
    8 9
    1 10
    12 13
    11 14
    0 15

    解析:这个题要用到栈的思想。但注意,女生和男生在队列里出现的顺序不合适则可能会使得 部分女生没法往前找到 对应的男生离开队列。
    比如输入:aaabbbbbbbaaaa,前三个男生跟他们后面的三个女生离开,这样一来 ,后面的四个女生没法往前面找到对应的男生一起离开。 因为还有四个男生在后面还没进栈。
    我下面的代码对此的处理就是直接return 结束程序了。这样处理不是很好,但这个情况在题目里面 没说怎么处理,而且题目本意没有这样的输入的。这个处理方法AC了。

     1 #include<stdio.h>
     2 struct stu
     3 {
     4     int number;
     5     char xingBie;
     6 };
     7 int main()
     8 {
     9     char boy,ch;
    10     int end=0,num=0;
    11     struct stu a[55];
    12     scanf("%c",&boy);
    13     a[0].xingBie=boy;
    14     a[0].number=num;
    15     while(scanf("%c",&ch)!=EOF)
    16     {
    17         if(ch==boy)
    18         {
    19             end++;
    20             num++;
    21             a[end].xingBie=ch;
    22             a[end].number=num;
    23             
    24         }
    25         else
    26         {
    27             num++;
    28             printf("%d %d
    ",a[end].number,num);
    29             end--;
    30             if(end<0)
    31                 return 0;
    32         }
    33     }
    34     return 0;
    35 }

    递归代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 char str[110];
     5 int len;
     6 char boy;
     7 
     8 int fun(int nowIndex);
     9 int main(int argc, char *argv[])
    10 {
    11     freopen("data.in","r",stdin);
    12     scanf("%s",str);
    13     
    14     boy=str[0];
    15     len=strlen(str);
    16     fun(0);
    17     return 0;
    18 }
    19 int fun(int nowIndex)
    20 {
    21     int girlIndex;
    22     if(nowIndex!=len)
    23     {
    24         if(str[nowIndex]==boy)
    25         {
    26             girlIndex=fun(nowIndex+1);
    27             if(girlIndex!=-1)
    28             {
    29                 printf("%d %d
    ",nowIndex,girlIndex);
    30                 return fun(girlIndex+1);//这一行的参数非常重要,一定要从girlIndex下一个位置继续扫描 
    31             }
    32         }
    33         else return nowIndex;//遇到的是代表小女孩的字符,返回其下标 
    34     }
    35     return -1;
    36 }

    上述递归代码参考了以下代码,来源:http://blog.csdn.net/abc8730866/article/details/56901667

     1 #include <iostream>  
     2 using namespace std;  
     3 char man;  
     4 //参数;char str[],字符串  
     5 //int s,开始位置  
     6 //返回值:返回本层的右括号位置  
     7 int founction(char str[], int s)  
     8 {  
     9     int n;  
    10     if (str[s] != man)  
    11     {  
    12         return s;  
    13     }  
    14     else  
    15     {  
    16         n = founction(str, s + 1);  
    17         cout << s << ' ' << n << endl;  
    18         return founction(str, n + 1);  
    19     }  
    20 }  
    21 int main()  
    22 {  
    23     char str[101] = { 0 };  
    24     cin >> str;  
    25     man = str[0];  
    26     int n = founction(str, 1);  
    27     cout << "0 " << n << endl;  
    28     return 0;  
    29 }
  • 相关阅读:
    请求转发和重定向实现与Ajax实现表单登陆
    jquery学习:
    Ajax一目了然
    EL和JSTL
    jsp(java server pages):java服务器端的页面
    Vue 第二章 自定义修饰符、指令、生命周期函数
    Vue 第一章练习 列表的案例
    Vue 第一章练习 v-for
    第一章 Vue之代码基本结构、插值表达式、事件修饰符
    Vue之父组件传值给子组件
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7238768.html
Copyright © 2011-2022 走看看