码迷,mamicode.com
首页 > 其他好文 > 详细

射击游戏---栈与子弹(2)

时间:2014-11-22 22:51:33      阅读:461      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   ar   color   os   sp   

【栈】射击游戏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


解题思路本题的解题思路依旧可以参考前面笔者的栈与子弹的方法:即是在放第N+1颗子弹的时候,我们必须把它放在第N颗子弹的后面或者前面一位

这样才能满足栈的输出过程。这样我们只要检测每递增一位的合法性就能很容易判断YESorNo了(9次判断即可),而不必去模拟栈的过程。

代码利用hash特性的数组来快速定位1,2,3,4`的位置。每次检测只需检测本位的下一位的位置合法性即可;

代码如下:

#include<iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
    int t, n;
    int x[11], y[11];
    cin >> t;
    while(t--) {
        int flag = 0;
        for (int i = 1; i< 11; i++) {
            cin >> n;
            x[n] = i;
            y[i] = n;
        }
        for (int i = 1; i < 10; i++) {
            if (x[i+1] < x[i] && y[x[i+1]] != y[x[i+1]+1] + 1) {
                flag = 1;
                break;
            }
        }
        if (flag) {
            cout << "No" << endl;
        } else {
            cout << "Yes" << endl;
        }
    }
}

 

 

射击游戏---栈与子弹(2)

标签:des   style   blog   http   io   ar   color   os   sp   

原文地址:http://www.cnblogs.com/KiddingJohn/p/4115770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!