标签:getch pre cin def 空格 inline using NPU 题目
大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
5 1 5
3 3 1 2 5
3
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include <math.h> #include<bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } const int INF=0x3f3f3f3f; const int maxn=1e5+100; int n,en,be; int a[maxn]; int ej[maxn];//摁键数 void inint(){ cin>>n>>be>>en; for(int i=1;i<=n;i++){ cin>>a[i]; ej[i]=-1; } ej[be]=0; } int main(){ inint(); int p=0; int flag=1; while(ej[en]==-1&&flag){ flag=0; for(int i=1;i<=n;i++){//每一次找可以转移的状态 if(ej[i]==p){//如第一次找p=0,第二次找p=1的 int j=i+a[i];//如果flag=0说明不能到输出-1 if(j<=n&&ej[j]==-1){ ej[j]=p+1; flag=1; } j=i-a[i]; if(j>0&&ej[j]==-1){ ej[j]=p+1; flag=1; } } } p++; } printf("%d",ej[en]); }
AC代码2:dfs
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include <math.h> #include<bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } const int INF=0x3f3f3f3f; const int maxn=1e5+100; int n,m,k,s=INF; int a[maxn]; int b[maxn]; void inint(){ cin>>n>>m>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } b[m]=1; } void dfs(int now,int num){ if(now==k){ s=min(s,num); } else if(num<=s){ b[now]=1; if(now+a[now]<=n&&b[now+a[now]]==0){ dfs(now+a[now],num+1); } if(now-a[now]>=0&&b[now-a[now]]==0){ dfs(now-a[now],num+1); } b[now]=0; } } int main(){ inint(); dfs(m,0); if(s==INF){ printf("-1\n"); } else{ printf("%d",s); } return 0; }
标签:getch pre cin def 空格 inline using NPU 题目
原文地址:https://www.cnblogs.com/lipu123/p/12344385.html