dfs做奇怪的电梯
看看这可恶的题目
40分代码: #include <bits/stdc++.h> #define for(i,l,r) for(int i=l;i<=r;i++) #define inf 0x7f using namespace std; int ans=inf,n,s,e,a[inf],f[inf],step; void dfs(int now,int step){ if(now==e) { ans=min(ans,step); } else if(step<=ans) { f[now]=1; if(now+a[now]<=e&&f[now+a[now]]==0){ dfs(now+a[now],step++); } if(now-a[now]>0&&f[now-a[now]]==0){ dfs(now-a[now],step++); } f[now]=0; } } int main(){ ios::sync_with_stdio(0); cin>>n>>s>>e; for(i,1,n){ cin>>a[i]; } f[s]=1; dfs(s,0); if(ans!=inf) cout<<ans; else cout<<"-1"; return 0; } 60分代码:(其他四个的时t掉的) #include <bits/stdc++.h> #define for(i,l,r) for(int i=l;i<=r;i++) #define inf 0x7f7f using namespace std; int ans=inf,n,s,e,a[inf],f[inf],step; void dfs(int now,int step){ if(now==e) { ans=min(ans,step); return; } else if(step<=ans) { if(now+a[now]<=e){ step++; f[now+a[now]]=1; dfs(now+a[now],step); step--; f[now+a[now]]=0; } if(now-a[now]>0){ f[now-a[now]]=1; step++; dfs(now-a[now],step); step--; f[now-a[now]]=0; } } } int main(){ ios::sync_with_stdio(0); cin>>n>>s>>e; for(i,1,n){ cin>>a[i]; } f[s]=1; dfs(s,0); if(ans!=inf) cout<<ans; else cout<<"-1"; return 0; } 70分代码: #include <bits/stdc++.h> #define for(i,l,r) for(int i=l;i<=r;i++) #define inf 0x7f using namespace std; int ans=inf,n,s,e,a[inf],f[inf],step; void dfs(int now,int step){ if(now==e) { ans=min(ans,step); return; } else if(step<=ans) { if(now+a[now]<=e&&f[now+a[now]]==0){ step++; f[now+a[now]]=1; dfs(now+a[now],step); step--; f[now+a[now]]=0; } if(now-a[now]>0&&f[now-a[now]]==0){ f[now-a[now]]=1; step++; dfs(now-a[now],step); step--; f[now-a[now]]=0; } } } int main(){ ios::sync_with_stdio(0); cin>>n>>s>>e; for(i,1,n){ cin>>a[i]; } f[s]=1; dfs(s,0); if(ans!=inf) cout<<ans; else cout<<"-1"; return 0; } 80分: #include <bits/stdc++.h> #define for(i,l,r) for(int i=l;i<=r;i++) #define inf 0x7f7f7f using namespace std; int ans=inf,n,s,e,a[207],step; bool f[207]; void dfs(int now,int step){ if(now==e) { ans=min(ans,step); } if(step<=ans) { if(now+a[now]<=e&&f[now+a[now]]==0){ f[now]=1; dfs(now+a[now],++step); f[now]=0; } if(now-a[now]>0&&f[now-a[now]]==0){ f[now]=1; dfs(now-a[now],++step); f[now]=0; } } } int main(){ ios::sync_with_stdio(0); cin>>n>>s>>e; for(i,1,n){ cin>>a[i]; } f[s]=1; dfs(s,0); if(ans!=inf) cout<<ans; else cout<<"-1"; return 0; } 100分 #include <bits/stdc++.h> #define for(i,l,r) for(int i=l;i<=r;i++) #define inf 0x7f7f7f using namespace std; int ans=inf,n,s,e,a[207],step; bool f[207]; void dfs(int now,int step){ if(now==e) { ans=min(ans,step); return; } if(step<=ans) { if(now+a[now]<=e&&f[now+a[now]]==0){ f[now]=1; dfs(now+a[now],++step); f[now]=0; step--; } if(now-a[now]>0&&f[now-a[now]]==0){ f[now]=1; dfs(now-a[now],++step); f[now]=0; step--; } } } int main(){ ios::sync_with_stdio(0); cin>>n>>s>>e; for(i,1,n){ cin>>a[i]; } f[s]=1; dfs(s,0); if(ans!=inf) cout<<ans; else cout<<"-1"; return 0; }
是不是惊人的相似,其实就是回溯的正确与否,不要太相信题解,,不要太相信题解,不要太相信题解,不要太相信题解@@@@@
原绿色洒满天际