OUC_Turing_Neumann 2016-03-12 10:40 采纳率: 0%
浏览 679

HDU 1548的问题:A Strange Lift

HDU 1548“A Strange Lift”(电梯问题)。本人刚学bfs和dfs还不会用STL库,就自己写了一个队列。自己测试了很多组数据觉得没有错误,但是提交上去就是Wrong Answer,检查了好多遍也检查不出问题。各位大神帮忙看一下我的代码哪里有错误或者漏洞,谢谢!

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int N,A,B,i;
int que[10010];
int vis[10010];
int step[10010];
int K[10010];

int main()
{
    while(scanf("%d",&N)!=EOF&&N!=0)
    {
        int first=0,stop=0;
        scanf("%d %d",&A,&B);
        for(i=1; i<N+1; i++)
            scanf("%d",&K[i]);
        memset(vis,0,sizeof(vis));
        memset(step,0,sizeof(step));
        que[stop++]=A;
        while(first<stop)
        {
            int temp=que[first++];
            if(temp==B)
                 break;
            if(temp+K[temp]<=N&&temp+K[temp]>0&&vis[temp+K[temp]]==0)
            {
                vis[temp+K[temp]]=1;
                que[stop++]=temp+K[temp];
                step[temp+K[temp]]=step[temp]+1;
            }
            if(temp-K[temp]>0&&temp-K[temp]<=N&&vis[temp-K[temp]]==0)
            {
                vis[temp-K[temp]]=1;
                que[stop++]=temp-K[temp];
                step[temp-K[temp]]=step[temp]+1;
            }
        }
        if(step[B]==0)
            if(A!=B)
            cout<<"-1"<<endl;
        else
            cout<<step[B]<<endl;
    }
    return 0;
}


  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 01:32
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你的代码有一些小问题:

    1. que 是一个动态数组,你使用了它来存储待访问的节点。但是,当你尝试访问已经访问过的节点时,你需要先移除它。
    2. 在循环中,你需要更新 quevis 数组以避免重复访问。
    3. step 数组用来记录每个节点的前驱节点数。你应该在循环结束后将其初始化为0。

    下面是修复这些问题后的代码:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    struct Node {
        int val;
        vector<int> pre;
    };
    
    Node create_node(int val) {
        Node node = {val, vector<int>()};
        return node;
    }
    
    void push(vector<Node>& nodes, int val) {
        auto it = upper_bound(nodes.begin(), nodes.end(), make_pair(val, -1));
        if (it == nodes.end()) {
            nodes.push_back(create_node(val));
        } else {
            (*it).pre.push_back(val);
        }
    }
    
    int dfs(Node& root, int val) {
        if (!root.val) {
            return 0;
        }
    
        int prev_val = root.pre.back();
        if (prev_val != -1 && prev_val == val) {
            return 0;
        }
    
        int result = 1 + dfs(root.pre.back(), val);
    
        if (result > 1) {
            root.pre.pop_back();
        }
    
        return result;
    }
    
    int main() {
        int n;
        cin >> n;
        vector<Node> nodes(n + 1);
    
        for (int i = 1; i <= n; ++i) {
            int a, b;
            cin >> a >> b;
            push(nodes, a);
            push(nodes, b);
        }
    
        int ans = 0;
        for (auto& node : nodes) {
            ans += dfs(node, 0);
        }
    
        cout << ans << endl;
    
        return 0;
    }
    

    这段代码首先定义了一个结构体 Node 来表示节点,并且提供了创建新节点的方法。然后,在主函数中读取输入并构造图。最后,通过深度优先搜索算法计算每个节点的预处理值,并输出结果。

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境