【栈】射击游戏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次判断即可),而不必去模拟栈的过程。
每次检测只需检测本位的下一位的位置合法性即可,注意一点,每次判断完后记得删除这一位,至于原因大家模拟插入时的原理去理解就行了;
代码如下:
#include<iostream> using std::cin; using std::cout; using std::endl; int findpos(int i, int n, int a[]) { int j; for (j = 0; j < n; j++) { if (a[j] == i) { break; } } return j; } int main() { int t, n, j; int x[10]; cin >> t; while(t--) { int flag = 0; for (int i = 0; i< 10; i++) { cin >> n; x[i] = n; } n = 10; for (int i = 10; i >= 2; i--) { if (findpos(i, n, x) < findpos(i - 1, n, x) && x[findpos(i, n, x)] != x[findpos(i, n, x) + 1] + 1) { flag = 1; break; } for (int k = findpos(i, n, x); k < n - 1; k++) { x[k] = x[k + 1]; } n--; } if (flag) { cout << "No" << endl; } else { cout << "Yes" << endl; } } }
代码略菜~~~,请见谅~~~祝大家周末愉快~