zoukankan      html  css  js  c++  java
  • hdu 1226 BFS + bfs记录路径

    http://acm.hdu.edu.cn/showproblem.php?

    pid=1226

    为了节省空间。您可以使用vis初始化数组初始化-1。

    发现BFSeasy错了地方 始一直WA在这里:就是我int tp=q.front();之后立即q.pop();了,然后才去推断是不是符合条件以break,这样就不能依据q.empty()==1觉得没有找到ans 由于这里WA了

    事实上也能够vis[0] == -1来推断

    比較不理解的是 当n==0的时候 %n==0的时候怎么处理

    //#pragma comment(linker, "/STACK:102400000,102400000")
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <map>
    #include <set>
    #include <queue>
    using namespace std;
    
    #define ls(rt) rt*2
    #define rs(rt) rt*2+1
    #define ll long long
    #define ull unsigned long long
    #define rep(i,s,e) for(int i=s;i<e;i++)
    #define repe(i,s,e) for(int i=s;i<=e;i++)
    #define CL(a,b) memset(a,b,sizeof(a))
    #define IN(s) freopen(s,"r",stdin)
    #define OUT(s) freopen(s,"w",stdout)
    const ll ll_INF = ((ull)(-1))>>1;
    const double EPS = 1e-8;
    const double pi = acos(-1.0);
    const int INF = 100000000;
    
    const int MAXN = 5000+100;
    int n,c,m;
    int a[MAXN],vis[MAXN],pre[MAXN];//pre记录路径
    int ans[MAXN];
    
    queue<int>q;
    
    int num;
    
    void dfs(int u)
    {
        ans[num++]=vis[u];
        if(pre[u] == -1)return;
        dfs(pre[u]);
    }
    
    void print()
    {
        num--;
        while(!ans[num])num--;
        for(int i=num;i>=0;i--)
            printf("%c",ans[i]+ (ans[i]>9?'A'-10:'0') );
        putchar('
    ');
    }
    
    void solve()
    {
        CL(vis,0xff);
        CL(pre,0xff);
        if(!n && !a[0])
        {
            puts("0");
            return;
        }
        if(!n && a[0])//
        {
            puts("give me the bomb please");
            return;
        }
        while(!q.empty())q.pop();
        for(int i=0;i<m;i++)
            if(a[i])
            {
                int tmp=a[i]%n;
                if(vis[tmp]==-1)
                {
                    vis[tmp]=a[i];//记录tmp由a[i]得来
                    pre[tmp]=-1; //
                    q.push(tmp);
                }
            }
        int tp=0,flag=0;////
        while(!q.empty())
        {
            tp=q.front();q.pop();
            if(!tp){flag=1;break;}
            for(int i=0;i<m;i++)
            {
                int tmp=(tp*c+a[i])%n;
                if(vis[tmp] == -1)
                {
                    vis[tmp]=a[i];
                    pre[tmp]=tp;
                    q.push(tmp);
                }
            }
        }
        if(!flag)
        {
            puts("give me the bomb please");
            return;
        }
        num=0;
        dfs(0);
        if(num>500)
        {
            puts("give me the bomb please");
            return;
        }
        print();
    }
    
    int main()
    {
        //IN("hdu1226.txt");
        int ncase;
        scanf("%d",&ncase);
        while(ncase--)
        {
            scanf("%d%d%d",&n,&c,&m);
            char op[5];
            for(int i=0;i<m;i++)
            {
                scanf("%s",op);
                if(op[0] >='A' && op[0] <='F') a[i]=op[0]-'A'+10;
                else a[i]=op[0]-'0';
            }
            sort(a,a+m);
            solve();
        }
        return 0;
    }
    


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    【笔记】关于全栈开发、技术发展方向,软件开发模式的思考
    转 mysql 自动安装部署
    转shell不能执行su 后的脚本
    11.2 rman 备份 放在DG 库上跑,可能遇到的问题。
    highchart 学习
    每周定时备份linux 文件内容 到 远端主机
    转 javascript 本地时间 和utc 节点 和 时间戳转换 的
    转 钢铁侠的云之舞~多租户,Docker,虚拟机 , 你怎么选?
    转 perl 的调试
    转 pt-query-digest 使用实例
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4856682.html
Copyright © 2011-2022 走看看