文章

10

粉丝

40

获赞

2

访问

4.9k

头像
老鼠回家路 小白也能看懂的题解:
P1946 北京航空航天大学2023年机试题
发布于2024年7月28日 22:57
阅读数 696

我的思路是维护一个栈,保证这个栈在从开始到终点的过程中就没有回头路,这样就会得到一个唯一路径,再将这个唯一路径做一下简单合并(注意方向要映射正确哈:1→2,2→1,3→4,4→3 这样)。但这个题一开始是一个恶心的字符串读取,数据格式a-b,a和b是两个数字,当然新手做可以遍历,在这里我也是做了一番研究,用了sstream的函数,直接分割出来了,甚至不用考虑字符串形式的数字到int形式的映射。所以还是觉得这个sstream的sscanf(str, "%d-%d", & first, & second)还是挺牛杯的。

结合上面的介绍,所以我的步骤如下:

1. 读取位置更新的方向和步长(也就是1-2这样的数据,不过每读一个都要维护一个没有回头路的路由,那自然用一个栈来维护是比较好的,因为只需要对栈顶操作就行)

2. 根据1中得到的路由,依次取出栈顶元素,如果方向一致就合并步长。

下面放代码:

#include <iostream>
#include <stack>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <sstream>

using namespace std;

typedef pair<int, int> PII;

int change(int a)
{
    if (a == 1) a = 2;
    else if (a == 2) a = 1;
    else if (a == 3) a = 4;
    else if (a == 4) a = 3;
    
    return a;
}

int main()
{
    stack<PII> route;
    
    string step;

    while(cin >> step && step != "0-0")
    {
        int first, second;
     ...
登录查看完整内容


登录后发布评论

2 条评论
stevezmm
2024年9月20日 16:10

连续输入相同方向会有问题,感觉是res.second在85-86行的问题

赞(0)

致敬大佬 : 回复 stevezmm: 感谢指正,这里res.second的维护确实逻辑不对,已更新了一版

2024年9月25日 20:41