Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8550 Accepted Submission(s): 3241
#include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; int t[210],vis[210]; int n,a,b; struct node { int cur; int steps; }start; int bfs() { queue<node> q; while(!q.empty()) q.pop(); start.cur=a; start.steps=0; vis[a]=1; q.push(start); node m,temp; while(!q.empty()) { temp=q.front(); q.pop(); if(temp.cur==b) return temp.steps; int up=temp.cur+t[temp.cur]; if(!vis[up]&&up<=n) { vis[up]=1; m.cur=up; m.steps=temp.steps+1; q.push(m); } int down=temp.cur-t[temp.cur]; if(!vis[down]&&down>0) { vis[down]=1; m.cur=down; m.steps=temp.steps+1; q.push(m); } } return -1; } int main() { while(scanf("%d",&n)&&n) { memset(vis,0,sizeof(vis)); scanf("%d%d",&a,&b); for(int i=1;i<=n;i++) scanf("%d",&t[i]); printf("%d\n",bfs()); } return 0; }
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int t[210]; int tot1,tot2,n,a,b; bool vis[210]; int flag1,flag2; int res1,res2; void dfs1(int x) { //printf("now=%d\n",x); //printf("tot=%d\n",tot); if(flag1) return; vis[x]=true; if(x==b) { res1=tot1;//printf("%d\n",tot); flag1=1; return; } else if(x>n||x<1) return; else { if(x+t[x]<=n&&vis[x+t[x]]==false) { tot1++; dfs1(x+t[x]); tot1--; if(flag1) return; } if(x-t[x]>=1&&vis[x-t[x]]==false) { tot1++; dfs1(x-t[x]); tot1--; } } } void dfs2(int x) { //printf("now=%d\n",x); if(flag2) return; vis[x]=true; if(x==b) { res2=tot2; flag2=1; return; } else if(x>n||x<1) return; else { if(x-t[x]>=1&&vis[x-t[x]]==false) { tot2++; dfs2(x-t[x]); tot2--; if(flag2) return; } if(x+t[x]<=n&&vis[x+t[x]]==false) { tot2++; dfs2(x+t[x]); tot2--; } } } int main() { int i; while(scanf("%d",&n)&&n) { tot1=tot2=0,flag1=flag2=0; res1=0,res2=0; memset(vis,0,sizeof(vis)); scanf("%d%d",&a,&b); for(i=1;i<=n;i++) scanf("%d",&t[i]); if(a==b) printf("0\n"); else if(a>n||b>n) printf("-1\n"); else { dfs1(a); memset(vis,0,sizeof(vis)); dfs2(a); if(flag1==0&&flag2==0) printf("-1\n"); else if(flag1==0&&flag2) printf("%d\n",res2); else if(flag1&&flag2==0) printf("%d\n",res1); else printf("%d\n",res2>=res1?res1:res2); } } return 0; } /* 5 1 4 2 3 1 2 1 ans=2 5 1 5 2 3 1 2 1 ans=3 5 1 5 3 1 1 2 1 ans=-1 3 2 2 1 1 1 ans=0 */