m0_66876619 2022-06-03 23:09 采纳率: 43.3%
浏览 56
已结题

关于#user#的问题,如何解决?(语言-c++)

#120. 「6-2」B、车站铁轨
时间限制:1000 ms
内存限制:128 MiB
输入文件:B.in
输出文件:B.out
题目类型:传统
评测方式:文本比较
上传者: liuser
题目描述
有 节车厢从 A 方向驶入车站,按进站顺序编号为 。

你的任务是让他们按照某中特定的顺序进入 B 方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站 C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入 C 的车厢必须按照相反的顺序驶出 C。对于每个车厢,一旦从 A 移入 C,就不能再回到 A 了;一旦从 C 移入 B,就不能回到 C 了。换句话说,在任意时刻,只有两种选择:A->C 和 C->B。
4.png

现在需要你写一个程序,判断给定的 B 方向驶出车站的车箱顺序是否可行,若不可行输出 'no';若可行则输出 'yes',并输出要能得到这个出站顺序,中转站 C 至少需要几个存放车厢的位置。

输入格式
输入文件 B.in

第 行一个整数 ,表示有 节车厢;
第 行 个整数,是 的排列,表示 B 方向驶出的车厢顺序。

输出格式
输出文件 B.out

若 B 方向出站车厢顺序不可行输出 "no",若可行,则输出 "yes",并在第二行输出中转站至少要提供车厢位置数。

样例
输入样例
5
1 2 3 4 5
输出样例
yes
1

  • 写回答

2条回答 默认 最新

  • 蒟蒻蒻蒻 2022-06-04 00:23
    关注

    此题因为是A进B出且C底部封闭,所以此题可以用栈的思想:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int Stack[100];
    int top,bottom;
    void initStack()
    {
        top = bottom = 0;
        return ;
    }
    void push(int n)
    {
        Stack[top++] = n;
        return ;
    }
    int pop()
    {
        int n = Stack[--top];
        return n;
    }
    int getTop()
    {
        int n = Stack[top-1];
        return n;
    }
    bool isEmpty()
    {
        if(top == bottom)
        {
            return true;
        }
        return false;
    }
    int findit(int x,int n,int a[])
    {
        for(int i = 0;i < n;i++)
        {
            if(a[i] == x)
            {
                return i;
            }
        }
    }
    int main()
    {
        initStack();
        int a[100],b[100];
        int n;
        cout << "输入车厢数:";
        
        //写入文件
        /*
        ifstream Cin("in.txt");
        cin >> n;
        cout << "车厢数:" << n << "个" << endl;
        Cin.close();
        
        */
        cin >> n;
        for(int i = 1;i <= n;i++)
        {
            a[i] = i;
        }
        for(int i = 0;i < n;i++)
        {
            cin >> b[i];
        }
        bool flag = true;
        int m = 0;
        for(int i = 0;i < n;i++)
        {
            int x = b[i];
            if(isEmpty())
            {
                int lo = findit(x,n,a);
                for(int j = m;j <= lo;j++)
                {
                    push(a[j]);
                }
                m = lo+1;
                pop();
            }
            else if(getTop() == x)
            {
                pop();
            }
            else
            {
                int lo = findit(x,n,a);
                if(lo < m)
                {
                    flag = false;
                    break;
                }
                for(int j = m;j <= lo;j++)
                {
                    push(a[j]);
                }
                m = lo+1;
                pop();
            }
        }
        if(flag)
        {
            //文件输入
            /*
            ifstream Cout("out.txt")
            cout << "Yes" << endl;
            Cout.close();
            */
            cout << "yes" << endl;
        }
        else
        {
            //文件输入
            /*
            ifstream Cout("out.txt")
            cout << "Yes" << endl;
            Cout.close();
            */
            cout << "no" << endl;
        }
        return 0;
    }
    

    不知道题目中的输入和输出格式是打印还是写入文件,所以答者把两种方法都写上了,题者可以自行选择

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月18日
  • 已采纳回答 6月10日
  • 创建了问题 6月3日

悬赏问题

  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 MATLAB四叉树处理长方形tif文件
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 使用Java milo连接Kepserver服务端报错?
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?
  • ¥20 软件开发方法学习来了