zoukankan      html  css  js  c++  java
  • 【栈】射击游戏1

    Description

    小明很喜欢玩射击游戏。他刚考完了数据结构期末考试,感觉不错,于是又来到了射击娱乐场放松一下。和上次一样,先从老板那租了一把步枪和装有N发子弹的弹夹。这里,再把规则说一遍。在射击的过程中,小明每次都有两种选择:从弹夹中取出一颗子弹上膛,或者打一发子弹出去。注意:所有的子弹都从枪口上膛。小明感觉这有点像《数据结构》课程中的“栈”的特点。因此在打完了这N发子弹之后,他想验证一下这些子弹打出来的顺序是不是真的满足“栈”的特性。假设N颗子弹的编号为1,2,…,N。子弹从弹夹中取出的顺序也是从1到N,这里N = 10。给定一个子弹被打出的顺序,你可以帮小明验证它满不满足“栈”的打出顺序吗?

    Input

    可能有多个测试输入,第一行给出总共的测试输入的个数。

    每个测试输入只有一行:用空格隔开的十个数,表示子弹打出的编号顺序。

    Output

    对每个测试输入,输出只有一行:

    “Yes”,如果打出顺序满足“栈”的特点;

    “No”,如果打出顺序不满足“栈”的特点。

    Sample Input

    Copy sample input to clipboard

    3

    1 2 3 4 5 6 7 8 9 10

    10 9 8 7 6 5 4 3 2 1

    3 1 2 4 5 6 7 8 9 10

    Sample Output

    Yes

    Yes

    No

    Problem Source: 课程上机练习题

     

    解题思路:

    模拟实际,一个数组test存储测例,一个栈bomb存储代表弹道,一个栈gun代表枪。

    1.初始化:test读取数据,gun为空,bomb一次编号。

    2.首先判断gun非空时,若与test匹配,则当前栈顶pop,继续判断test下一位;

    3.若gun为空或不匹配时,给gun上弹,popbomb的栈顶

    4.判断:此时bomb为空时,子弹都上枪了,肯定能满足栈的关系,输出yes,否则输出no

     

    实现代码:

     

    #include<iostream>
    #include<stack>
    using std::cin;
    using std::cout;
    using std::endl;
    using std::stack;  
    
    int main() {
        int T, tmp, t;     //T个测例 
        stack<int> gun;    //栈用来表示枪 
        stack<int> bomb;   //栈用来表示弹夹 
        int test[10];      //储存测试样例 
        bool flag = true;   //true表示弹夹有子弹,false表示弹夹为空 
        
        cin >> T;
        for (; T > 0; T--) {
            for (int i = 0; i < 10; i++) cin >> test[i];    //读取测例 
            for (int i = 10; i > 0; i--) bomb.push(i);      //弹夹的子弹依次编号 
            
            for (flag = true, tmp = 0, t = 0; t < 10;) {
                if (!gun.empty() && (gun.top() == test[t])) {  //枪非空且枪口与测例当前位置相等 
                    gun.pop();                             //子弹打出去 
                    t++;                                  //测例下移 
                    continue;                             //不上弹,继续重新判断 
                }
                
                if (!bomb.empty()) {                     //弹夹非空 ,给枪上弹 
                     tmp = bomb.top();
                     bomb.pop();
                     gun.push(tmp);
                } else {                                 //flag标记弹夹为空,跳出循环 
                    flag = false;
                    break;
                }
            }
            
            /*弹夹为空,说明子弹都能上枪,则枪肯定都能和测例匹配*/ 
            if (flag) cout << "Yes";     
            else cout << "No";
            /*T个测例,注意栈重新清空 */
            while(!bomb.empty()) bomb.pop();
            while(!gun.empty()) gun.pop();
            cout << endl;
        }
        
    }                                 

     

     (本博文或多或少参考过其他网上资料,但时间已久忘记当初的参考了,在此对他们表示感谢!)

     

    越努力越幸运~
  • 相关阅读:
    apache 问题 You don't have permission to access /test.php on this server 解决方法
    setTimeout和setInterval实现定时器的区别
    视图Ext.Viewport和窗口Ext.Window用法
    JavaScript设置Cookie
    布局Layout
    html中select标签刷新后不回到默认值而是保持之前选择值
    设置session失效的几种方法
    面板Ext.Panel使用
    树TreePanel
    让html元素随浏览器的大小自适应垂直居中
  • 原文地址:https://www.cnblogs.com/zengyh-1900/p/4064158.html
Copyright © 2011-2022 走看看