• (eden)Shooting Game


    Description:

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

    可能有多个测试输入,第一行给出总共的测试输入的个数T,和每个测试输入的子弹数N。(0 < T < 20, 0 < N < 10)

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

    输出YES或者NO表示判断结果

    例如

    INPUT:

    2 4

    4 3 2 1

    4 2 3 1

    OUTPUT:

    YES

    NO

     

    Hint:

    用数组就能解决了,大家想清楚判断逻辑再动手。

    万一坑了请评论区提醒,谢谢。

    代码

     1 #include<stdio.h>
     2 int main() {
     3     int t, n, i, j;
     4     scanf("%d%d", &t, &n);
     5     for (i = 1; i <= t; i++) {
     6         int k;
     7         int b[15] = {0};
     8         scanf("%d", &k);
     9         b[k] = 1;
    10         for (j = n; j > 1; j--) {
    11             int move;
    12             scanf("%d", &move);
    13             if (move > k) {
    14                 k = move;
    15                 b[k] = 1;
    16                 continue;
    17             } else {
    18                 int pd = k;
    19                 while (b[pd] != 0) pd--;
    20                 if (pd == move) {
    21                     k = move;
    22                     b[k] = 1;
    23                     continue;
    24                 } else {
    25                     printf("No
    ");
    26                     int jj, xiaochu;
    27                     for (jj = j - 1; jj > 1; jj--) {
    28                         scanf("%d", &xiaochu);
    29                     }
    30                     break;
    31                 }
    32             }
    33         }
    34         if (j == 1) printf("Yes
    ");
    35     }
    36 }

    解释

    以栈的方式走一个就是打出前面放入的一个子弹(没有打出来过的)不能够是前面第二个,要紧贴着当前这一个,要么就是打出后面的子弹(还没有放入),但是后面任意一个都可以,因为可以一直一个一个放子弹,然后如果这两种情况有一个满足,说明下面那个点是可以走的,就把该点设为当前考虑点,循环上面的步骤;

                     {要么走前面一个没有走过的点}

    第一个点进入{要么走后面任意一个可以走的点}再把当前的点设置为现在考虑的点;

    标程

    1.#include<stdio.h>
    2.int main() {
    3.    int t, n;
    4.    scanf("%d %d", &t, &n);
    5.    while (t--) {
    6.        int s[15] = {};
    7.        int temp;  // 存放s[i]之后可能存在的第一个比s[i]小的
    8.        int flag1;  // 标识s[i]之后是否存在比s[i]小的
    9.        int flag2;  // 标识出栈序列是否非法
    10.        int i, j, k;
    11.        for (i = 1; i <= n; i++)
    12.            scanf("%d", &s[i]);
    13.        for (i = 1; i < n; i++) {
    14.            flag1 = 0;
    15.            flag2 = 0;
    16.            for (j = i + 1; j <= n; j++)  // 寻找s[i]之后第一个比s[i]小的
    17.                if (s[j] < s[i]) {  // s[i]之后存在比s[i]小的
    18.                    temp = s[j];  // s[j]是s[i]之后第一个比s[i]小的
    19.                    flag1 = 1;
    20.                    break;
    21.                }
    22.            if (flag1 == 1)
    23.                for (k = j + 1; k <= n; k++)
    24.                    if (s[k] < s[i])  // s[j]之后如果还有比s[i]小的数
    25.                        if (s[k] >= temp) {  // 出栈序列非法
    26.                            flag2 = 1;
    27.                            break;
    28.                        }
    29.                        else  // 都必须小于它之前的一个比s[i]小的数
    30.                            temp = s[k];  // 更新temp
    31.            if (flag2 == 1) {
    32.                printf("No
    ");
    33.                break;
    34.            }
    35.        }
    36.        if (flag2 == 0)
    37.            printf("Yes
    ");
    38.        }
    39.        return 0;
    40.}
  • 相关阅读:
    文本框的正则表达式验证
    八皇后问题 回溯法
    Repeater中使用倒计时
    c#导入excel 绑定数据 repeat为例子
    "table" is not mapped 解决方法
    NHibernate的常见问题及解决方案
    Nginx日志切割,跨域配置,防盗链配置
    springboot跨域配置
    图片上传,文件url地址添加时间戳,防止浏览器缓存的情况
    使用Hibernate数据验证
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5122360.html
Copyright © 2020-2023  润新知