• HDOJ1548(DFS超内存,BFS过了)


    DFS代码

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define Min(a,b) (a<b)?a:b
    const int MAX_N=205;
    const int INF=0x30303030;
    int floors[MAX_N];
    int N, A, B;
    int step[MAX_N];
    int dfs(int k)
    {
        if(k<1||k>N)    return INF;
        if(step[k]!=-1)
        {
            return step[k];
        }
        if(k==B)
        {
            return 0;
        }
        return step[k]=Min(dfs(k-floors[k])+1,dfs(k+floors[k])+1);
    }
    
    int main()
    {
          while(scanf("%d",&N)!=EOF&&N!=0)
          {
              scanf("%d %d",&A, &B);
              for(int i=1; i<=N; i++)
              {
                  scanf("%d",&floors[i]);
              }
              memset(step,-1,sizeof(step));    
              int ans=dfs(A);
              if(ans>=INF)
              {
                  printf("-1
    ");
              }
              else
              {
                  printf("%d
    ",ans);
              }
          }
          
        return 0;
    }

    BFS:AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int MAX_N=205;
    const int INF=0x30303030;
    int floors[MAX_N];
    int N, A, B;
    typedef pair<int, int> P;
    int vis[MAX_N];
    
    int bfs()
    {
        memset(vis, 0, sizeof(vis));
        queue<P> que;
        que.push(P(0,A));
        vis[A]=1;
        while(!que.empty())
        {
            P pos=que.front();que.pop();
            int k=pos.second;
            int step=pos.first;
            if(k==B)
            {
                return step;
            }
            for(int i=-1; i<=1; i++)
            {
                int next=(k + i*floors[k]);
                if(next>=1&&next<=N&&!vis[next])
                {
                    vis[next]=1;
                    que.push(P(step+1,next));
                }
            }
            
        }
        
        return INF;
    }
    
    int main()
    {
          while(scanf("%d",&N)!=EOF&&N!=0)
          {
              scanf("%d %d",&A, &B);
              for(int i=1; i<=N; i++)
              {
                  scanf("%d",&floors[i]);
              }
              int ans=bfs();
              if(ans==INF)
              {
                  printf("-1
    ");
              }
              else
              {
                  printf("%d
    ",ans);
              }
          }
          
        return 0;
    }
  • 相关阅读:
    修复grub引导Centos8和Windows
    少儿编程到底学什么?
    Windows平台最方便最易用的法语输入法
    ServiceStack.OrmLite 入门(一)
    起步:Proteus 8 仿真 Arduino 1.8.2
    命令行方式登录PostgreSQL
    CentOS 7 安装 PostgreSQL
    Twitter开源的Heron快速安装部署教程
    centos7下使用yum安装mysql
    [转]centos7 下安装MongoDB
  • 原文地址:https://www.cnblogs.com/program-ccc/p/4768682.html
Copyright © 2020-2023  润新知