6 条题解

  • 0
    @ 2025-3-30 20:31:38
    int main() {
        int n, a, b;
        cin >> n >> a >> b;
        vector<int> nums(n + 1);
        for (int i = 1; i <= n; i++) {
            cin >> nums[i];
        }
    
        vector<bool> visited(n + 1, false);
        queue<State> q;
        q.push(State(a, 0));
        visited[a] = true;
    
        while (!q.empty()) {
            State current = q.front();
            q.pop();
    
            if (current.floor == b) {
                cout << current.presses << endl;
                return 0;
            }
    
            int up = current.floor + nums[current.floor];
            int down = current.floor - nums[current.floor];
    
            if (up <= n && !visited[up]) {
                q.push(State(up, current.presses + 1));
                visited[up] = true;
            }
            if (down >= 1 && !visited[down]) {
                q.push(State(down, current.presses + 1));
                visited[down] = true;
            }
        }
        cout << -1 << endl;
        return 0;
    }
    
    • 0
      @ 2025-3-27 18:07:17
      using namespace std;
      int n,a,b;
      int k[202];
      bool visit[202]={0};//标记数组 
      int fuhao[3]={0,1,-1};
      int flag,sum=0; 
      int ceng=1,jie=0,xia=0;//当前层节点数量,当前层遍历到第几个节点 
      queue<int> q;
      
      void bfs()
      {
      	q.push(a);//当前楼层进入队列
      	visit[a]=1; 
      	while(!q.empty()){
      		int c=q.front();//取出队列第一个元素 
      		if(c!=b) q.pop(); 
      		else {
      			flag=1;//输出次数 
      			return;
      		}	
      		for(int i=1;i<=2;i++)
      		{
      			int d=c+fuhao[i]*k[c];
      			if(d>=1 && d<=n && !visit[d])
      			{
      				visit[d]=1;
      				q.push(d);
      				xia++;//记录下一层节点个数 
      			}
      			
      		}
      		jie++;	//遍历的节点数加一,直到该层遍历完,层数加一
      		if(jie==ceng) 
      		{
      			ceng=xia;
      			xia=0;
      			jie=0; 
      			sum++;
      		}
      	}	
      	return;
      }
      
      int main(){
      	cin>>n>>a>>b;
      	for(int i=1;i<=n;i++){
      		cin>>k[i];
      	}
      	flag=0;
      	sum=0;
      	bfs();
      	if(flag==0){
      		cout<<-1;
      	}
      	else cout<<sum;
      	return 0;
      }
      
      
      • 0
        @ 2025-3-17 22:04:08

        BFS

        #include <iostream>
        #include <cstring>
        #include <queue>
        
        using namespace std;
        
        const int N = 210;
        int n, a, b;
        int arr[N], d[N];
        int m[2] = {1, -1};
        queue<int> q;
        
        int bfs(int a, int b) // a, b 为下标(电梯楼层)
        {
        	q.push(a);
        	
        	d[a] = 0;
        	
        	while (!q.empty())
        	{
        		int t = q.front();
        		q.pop();
        		
        		for (int i = 0; i <= 1; i++)
        		{
        			int nx = t + arr[t] * m[i];
        			
        			if (nx >= 1 && nx <= n && d[nx] == -1)
        			{
        				d[nx] = d[t] + 1;
        				q.push(nx);
        			}
        		}
        	}
        	return d[b];
        }
        
        int main()
        {
        	cin >> n >> a >> b;
        	
        	for (int i = 1; i <= n; i++) cin >> arr[i];
        	
        	memset(d, -1, sizeof d);
        	
        	cout << bfs(a, b);
        	
        	return 0;
        }
        
        • 0
          @ 2024-4-12 14:21:45

          DFS

          最少次数,每次都要更新p数组,初始为正无穷

          #include <iostream>
          #include <cstring>
          
          using namespace std;
          
          const int N = 210;
          
          int n, a, b;
          int d[N];
          int p[N];
          int flag;
          
          void dfs(int u, int level)
          {
              p[level] = u;
              if (level == b)
              {
                  flag = true;
                  return;
              }
              if (level + d[level] <= n && u + 1 < p[level + d[level]])
                  dfs(u + 1, level + d[level]);
          
              if (level - d[level] >= 1 && u + 1 < p[level - d[level]])
          
                  dfs(u + 1, level - d[level]);
          }
          
          void solve()
          {
              memset(p, 0x3f, sizeof p);
              cin >> n >> a >> b;
              for (int i = 1; i <= n; i++)
                  cin >> d[i];
              dfs(0, a);
              if (flag)
                  cout << p[b] << endl;
              else
                  cout << -1 << endl;
          }
          
          int main()
          {
              solve();
          
              system("pause");
              return 0;
          }
          
          • 0
            @ 2024-4-8 9:06:53
            #include <iostream>
            #include <queue>
            #include <cstring>
            #define x first
            #define y second
            using namespace std;
            const int N=210;
            int g[N];
            int st[N];
            typedef pair<int,int>PII;
            int n;
            
            void bfs(int start,int end)
            {
            	queue<PII>q;
            	q.push({start,g[start]});
            	st[start]=0;
            	
            	while(q.size())
            	{
            		auto t=q.front();
            		q.pop();
            		
            		int a=t.x-g[t.x],b=t.x+g[t.x];
            		if(a>=1&&st[a]==-1){
            			q.push({a,g[a]});
            			st[a]=st[t.x]+1;
            		}
            		
            		if(b<=n&&st[b]==-1){
            			q.push({b,g[b]});
            			st[b]=st[t.x]+1;
            		}	
            	}
            }
            
            int main()
            {
            	int a,b;
            	cin>>n>>a>>b;
            	
            	for(int i=1;i<=n;i++)	cin>>g[i];
            	
            	memset(st,-1,sizeof st);
            	bfs(a,b);
            	
            	cout<<st[b];
            	return 0;
            }
            
            • 0
              @ 2024-4-6 15:52:08
              #include <cstdio>
              #include <vector>
              #include <queue>
              #include <utility>
              #include <functional>
              
              using namespace std;
              
              int main() { 
              	int n, a, b;
              	scanf("%d %d %d", &n, &a, &b);
              	
              	vector<int> arr(n + 1);
              	for (int i = 1; i <= n; ++i)
              		scanf("%d", &arr[i]);
              	
              	long long res = 1e9;
              	vector<char> ita(n + 1, 0);
              // dfs 好像不行, 这样只有80分
              //	long long now = 0;
              //	function<void(int)> dfs = [&](int i) { // 递归爆炸 
              //		if (i <= 0 || i > n || ita[i])
              //			return;
              //		
              //		if (i == b) {
              //			res = min(res, now);
              //			return;
              //		}
              //		
              //		++now;
              //		ita[i] = 1;
              //		dfs(i + arr[i]);
              //		dfs(i - arr[i]);
              //		ita[i] = 0;
              //		--now;
              //	};
              	
              	queue<pair<int, long long>> Q; // 当前是第几层 , 操作次数 
              	Q.push({a, 0});
              	while (Q.size()) {
              		auto x = Q.front();
              		int cen = x.first;
              		long long cs = x.second;
              		Q.pop();
              		
              		if (cen == b) {
              			res = cs;
              			break;
              		}
              		
              		if (cen + arr[cen] <= n && !ita[cen + arr[cen]]) {
              			ita[cen + arr[cen]] = 1;
              			Q.push({cen + arr[cen], cs + 1});
              		}
              			
              		
              		if (cen - arr[cen] > 0 && !ita[cen - arr[cen]]) {
              			ita[cen - arr[cen]] = 1;
              			Q.push({cen - arr[cen], cs + 1});
              		}
              	}
              	
              //	dfs(a);
              	
              	printf("%lld\n", res == 1e9 ? -1 : res);
              	
              	return 0;
              }
              
              • 1

              信息

              ID
              85
              时间
              1000ms
              内存
              256MiB
              难度
              7
              标签
              递交数
              776
              已通过
              174
              上传者